@RequestBody는 http요청의 body를 그대로 받아 자바 객체로 변환해준다 (거의 JSON을 객체로)
그리고 단일 객체만을 처리할수 있도록 처리되어 있기 때문에, 여러 객체를 받고 싶을 경우 RequestBody를 여러개 사용할 수 없다.
객체 2개를 받아야 하는 경우, 그 객체 2개를 포함하는 클래스를 만들어서 처리한다. 다만 이 방법은, requestVO를 쉽게 건들 수 있는 상황이나 최초 개발하는 단계에서만 가능하다. 이미 개발된지 오래되었고, 해당 객체의 변화로 인하여 발생할 수 있는 문제점을 가늠하기 어려운 경우 사용할 수 없다.
{
"title" : "제목1",
"author" : "홍길동"
}
이란 구조에 사용자정보가 추가된다고 가정하자.
그러면 아래와 같이 단일 request로 구성해야 한다.
{
"board" : {
"title" : "제목1",
"author" : "홍길동"
},
"user" : {
"name" : "이순신",
"age" : "20"
},
"password" : "1234"
}
Controller에서 해당 정보를 가져와 분리하면 된다. 이를 위해 JacksonLibrary에 기본적으로 들어있는 ObjectNode 클래스응 이용한다.
@PutMapping("/board")
public BoardDTO update(@RequestBody ObjectNode saveObj) throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper(); // JSON을 Object화 하기 위한 Jackson ObjectMapper 이용
Board board = mapper.treeToValue(saveObj.get("board"), Board.class);
User user = mapper.treeToValue(saveObj.get("user"), User.class);
String password = saveObj.get("password").asText();
return boardService.update(boardDTO, password);
}