본문 바로가기
프로그래밍

Spring MappingJacksonJsonView modelKey가 하는 역할

by 탁구치는 개발자 2014. 3. 15.

현재 개발하고 있는 API 서버는 모든 HTTP Response 메세지를 JSON 스트링으로 리턴한다.

일단 JSON으로 리턴하지만 언젠가 "XML도 재공해 주세요." 라는 말이 나올수 있으므로 ContentNegotiatingViewResolver로 설정하여 개발을 하고 있는데 한 가지 이상한 현상이 있었다.


다음의 Controller 코드를 보면 GET 방식으로 /orderform 요청이 들어오면 파라미터 정보는 ModelAttribute인 OrderformDto에 담고 해당 DTO 객체를 orderService.orderform 으로 넘겨 데이터를 받아와 Result객체에 담은 후 DispatcherServlet으로 return 하는 코드이다.

@RequestMapping(value = "/orderform", method = RequestMethod.GET)

        public Result<OrderformDto> orderform(OrderformDto dto) {

               Result<OrderformDto> result = new Result<OrderformDto>();

               result.setData(orderService.orderform(dto));

               return result;

        }


이와 같이 코드를 작성하게 되면 Result 객체에 담겨있는 데이터만 jackson 라이브러리에서 object to json으로 변환 후 HTTP response 보낼 것이라고 예상했다.


헌데 Response로 보내진 JSON 스트링에 ModelAttribute인 orderformDto도 함께 찍혀 있는 것이었다.

표시되는 데이터가 많아 orderformDto의 데이터가 함께 찍힌다는 것도 한참 뒤에야 알게 되었는데 

삽질은 성공의 어머니라는 교훈으로 이 문제의 해결 방법을 찾아보았다.

{

    "result": {

        "ipAddress": "172.20.55.0",

        "resultCode": 0,

        ...

        ...

        ...

        ...

    },

    "orderformDto": {

        ...

        ...

        ...

    }

}


방법은 쉽게 찾을 수 있었다.

org.springframework.web.servlet.view.json.MappingJacksonJsonView 빈을 생성할 때 <property name="modelKey" value="result" /> 를 추가해 주면 되는 것이었다.

여기서 modelKey로 지정된 result 값만 HTTP Response 보내겠다는 의미로 보면 된다.


즉, 위의 JSON 스트링에서 result 만 사용하겠다는 것이다.