현재 개발하고 있는 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 만 사용하겠다는 것이다.
'프로그래밍' 카테고리의 다른 글
c:import 사용 시 주의사항 (Request method 'POST' not supported) (2) | 2014.05.16 |
---|---|
Tiles definition 렌더링 전 처리 방법 (ViewPreparer 사용) (0) | 2014.04.30 |
HTTP request body copy 방법 (0) | 2014.04.29 |
javascript self closing 문제 (2) | 2014.04.16 |
JUnit private method test (0) | 2014.03.04 |
제너릭 메소드 (0) | 2014.03.01 |
JUnit 테스트 실행 시 src/test/resource 패키지의 설정 파일만 읽어 들일까? (3) | 2014.02.25 |
jackson JSON 사용 중 UnrecognizedPropertyException 발생 시 (2) | 2014.02.15 |