[팁] @RequestBody로 여러 객체 받기

손성우·2022년 7월 26일
2

스프링

목록 보기
7/9

@RequestBody는 http요청의 body를 그대로 받아 자바 객체로 변환해준다 (거의 JSON을 객체로)
그리고 단일 객체만을 처리할수 있도록 처리되어 있기 때문에, 여러 객체를 받고 싶을 경우 RequestBody를 여러개 사용할 수 없다.

해결 방법

1. Request를 처리하는 VO를 수정한다.

객체 2개를 받아야 하는 경우, 그 객체 2개를 포함하는 클래스를 만들어서 처리한다. 다만 이 방법은, requestVO를 쉽게 건들 수 있는 상황이나 최초 개발하는 단계에서만 가능하다. 이미 개발된지 오래되었고, 해당 객체의 변화로 인하여 발생할 수 있는 문제점을 가늠하기 어려운 경우 사용할 수 없다.

2. Single Request로 구성한 후 다시 여러 객체로 쪼개서 처리하자(추천)

{
	"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);

    }
  • treeToValue 가 JSONProcessException을 내기 때문에 이에 대한 예외처리를 해줘야한다.
  • 간단히 String 정도의 정보 추가시에는 ObjectNode.get(T v).asText()를 추가하면된다.

참고
https://stackoverflow.com/questions/12893566/passing-multiple-variables-in-requestbody-to-a-spring-mvc-controller-using-ajax

profile
백엔드 개발자를 꿈꾸며 공부한 내용을 기록하고 있습니다.

0개의 댓글