Note
cf) HTTP 요청 관련 Spring의 애너테이션
- @RequestBody: Java에 정의한 Object 형태로 데이터를 전달받는 경우, 사용한다.
- 아래 쿼리 스트링과는 다르게 URL에 데이터가 표시되지 않으며 Json 형태로 request body를 전달할 수 있다.
- ex) 컨트롤러 메서드 안에 (@RequestBody Model model) 같은 형식으로 파라미터를 받을 수 있다.
- POST 요청 보낼 때 주로 쓰인다.
- Java에 Model 이라는 클래스가 꼭 정의되어 있어야한다.
- @RequestParam: url에 "localhost:8080/model?curPage=3&searchNm=apple" 와 같은 식으로 HTTTP 요청을 보내는 경우에 쓰인다.
- GET 을 통해 검색하기 위해 자주 쓰인다.
목록 선택 삭제 기능 구현 (프론트에서 axios요청으로 백엔드에 컬렉션 데이터 보내기)
- 어떤 리스트에 대한 선택 삭제 기능을 만들려고 한다.
- 프론트에서 axios DELETE 요청에서 Java의 List<String>형태로 삭제하려는 ID 리스트를 보내려고 한다.
- id=modelA&id=modelB&...와 같은 형태이다.
- 지금껏 어떤 데이터를 삭제할 때, @PathVariable을 통해 id를 전달해서 엔티티를 하나씩 삭제하는 방법만 구현해왔다. 그래서 이번에는 여러 개의 데이터를 어떻게 보낼지 고민을 했다.
- 특히 @RequestParam과 @RequestBody의 차이점에 대해 정확히 몰라서 더욱 헷갈렸다.
- 프론트
- list에 map(), join() 을 통해 "id =modelA&id=modelB&... " 와 같은 형태로 이어붙여서 query string을 만들었다.
- 이렇게 URL로 HTTP 요청하는 경우, Spring에서는 @RequestParam을 이용해서 List<String>형태로 데이터를 받을 수 있다.
- 참고로 apiUrls는 '백엔드에 요청을 보낼 API 주소 목록'을 정의한 Json 파일이다. 그 안에 정의한 deleteModelList 의 주소로 HTTP 요청을 보낸다.
- ex) "deleteModelList" : "localhost:8080/api/model" 과 같은 식으로 정의되어 있다.
<hide/>
const deleteRdfPropertyList = () => {
let list = [];
for (let model of modelList.value) {
if (model.deleteCheckBox === true) {
list.push(model.id);
}
}
if (list.length === 0) {
alert("삭제할 모델을 선택해주세요.");
return;
}
let deleteYn = confirm("삭제하시겠습니까?");
if (!deleteYn) {
return;
}
const serializedIds = list
.map((id) => `id=${id}`)
.join("&");
$axios
.delete(
`${$apiUrls.deleteModelList}?${serializedIds}`
)
.then(() => {
alert("삭제 완료하였습니다.");
goToList();
dialogModify.value = false;
})
.catch((err) => {
console.log(err);
alert(err.response.data.message);
}
}
}
- 백엔드(Spring)
- @RequestParam 적용한다.
- Spring 컨트롤러의 메서드 안에는 화면에서 선택한 모델의 id 정보를 List<String> 로 받을 수 있다.
<hide/>
/** 선택된 model 일괄 삭제 */
@DeleteMapping("/api/model")
public ResponseEntity<HttpStatus> delete(@RequestParam("id") List<String> list){
service.deleteModelList(list);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
PostgreSQL 배열 데이터
- PostgreSQL 안에는 _VARCHAR 형태로 필드를 만들면 배열 데이터를 담을 수 있다.
- 여기에 데이터를 넣고 지우는 방법을 알아보려고 한다.
- UPDATE
- SET 절의 array 안에 새롭게 넣어줄 배열을 정의한다.
- 아래와 같이 배열을 통째로 바꿀 수도 있다.
- 또는 배열의 특정 인덱스 위치에 있는 값만 바꿀 수도 있다.
- ex) fruit_arr[1] = "grape"와 같은 식으로 넣을 수 있다.
- INSERT도 아래와 같은 방식으로 배열 데이터를 넣을 수 있다.
<hide/>
UPDATE tb_fruitbasket
set fruit_arr = array['grape', 'apple']
where basket_id = 'BSK00001'
- SELECT
- array [] 안에 index를 넣어서 특정 위치에 있는 값만 가져오거나
- SELECT fruit_arr[1] 결과: mango
- array 를 그대로 가져올 수도 있다.
- SELECT fruit_arr 결과: {mango,grape,apple,banana}
- 배열 길이: array_length(배열명, 1)
- cf) fruit_arr[0] 에 데이터가 없는 경우에, fruit_arr[1] 에만 데이터를 넣으면 배열 길이는?
- 그래도 length는 1이다.
- 또한, fruit_arr를 SELECT 하더라도 NULL인 위치는 생략된다.
- array [] 안에 index를 넣어서 특정 위치에 있는 값만 가져오거나
<hide/>
select fruit_arr,
fruit_arr[0],
fruit_arr[1],
fruit_arr[2],
fruit_arr[3],
fruit_arr[4],
array_length(fruit_arr, 1)
from dtmeta.tb_fruitbasket
where basket_id = 'BSK00001'
TITLE
- content
- content
TITLE
- content
- content
참고) https://sudo-minz.tistory.com/158
https://aeliketodo.tistory.com/91
'개발 일지 > 주간 개발 일지' 카테고리의 다른 글
[08월 4주] MyBatis(string_agg, unnest), element plus를 이용한 스위치 버튼 만들기 (0) | 2023.09.04 |
---|---|
[08월 1주차] MyBatis bacth 처리 방법(INSERT, DELETE), Vue.js 3 폼 유효성 검증 (0) | 2023.08.04 |
[07월 1주차] Mybatis 바인딩 에러 해결 및 PostgreSQL 배열 관련 메서드 (0) | 2023.07.10 |
[06월 5주차] 반응형 객체 만드는 방법(ref, reactive), Postman 에서 만든 API 공유하는 방법(export) (0) | 2023.07.01 |
[06월 4주차] 프론트엔드 element plus 사용 방법 (0) | 2023.06.24 |