-
Spring에서 JSON을 편하게 리턴해보자! Jackson 라이브러리와 RestControllerKnowledge/Spring 2019. 8. 21. 21:29반응형
- JSON
먼저 JSON에 대해 알아보자. JSON은 경량의 데이터 교환에 유용한 데이터 포맷이다. 주로 Ajax로 서버와 통신하며 데이터를 주고 받을 때 데이터 교환을 쉽게 하기 위해 사용한다.
그러나 Spring에서 클라이언트 단으로 JSON을 리턴하고 싶을 땐 이런 저런 조치가 필요하다. 이를 본격적으로 알아보기 전에 우선 MessageConvertor에 대해 알아보자
- MessageConvertor
MessageConvertor는 스프링에서 자바 객체와 HTTP 요청 / 응답 바디를 변환하는 역할을 한다.
종류는 이처럼 다양한데 jackson라이브러리를 추가할 경우 객체를 JSON으로 변환하는 메시지 컨버터가 사용되도록 @EnableWebMvc에서 기본으로 설정되어 있다. 그렇기 때문에 Jackson 라이브러리를 추가하면 쉽게 JSON 메시지를 리턴할 수 있게 되는 것이다.
- jackson 라이브러리
jackson 라이브러리를 추가하는 건 어렵지 않다. https://mvnrepository.com 에서 Jackson Databind를 검색하고 버전을 택한 후 나오는 내용을 pom.xml에 붙여주면 끝이다. databind 는 jackson-core, jackson-annotation 에 의존성이 있으므로 pom 파일에는 databind 모듈만 기술해주면 되는 것이다.
그래서
이렇게만 추가해주면
Libraries - Maven Dependencies 안에 databind 외에도, jackson-annotations, jackson-core 을 확인할 수 있다.
아무튼 결론부터 말하자면 이러면 준비 끝이라는 얘기
- Spring Controller에서 Jackson을 사용하여 JSON 리턴하기
검색해보면 방법은 여러가지가 나온다. ObjectMapper를 사용하는 방법, @ResponseBody 를 사용하는 방법 등등이 나오는데 이에 대해 잘 설명한 포스팅 ( http://www.nextree.co.kr/p11205/ ) 은 이미 있어서 링크만 남기고 이번에 처음 사용해 본 @RestController 어노테이션을 활용해서 클래스 자체를 반환하는 방법을 포스팅해보려 한다.
- @RestController
RestController는 Spring 4 에서 Rest API 또는 Web API를 개발하기 위해 등장한 애노테이션이다. 이전버전의 @Controller와 @ResponseBody를 포함한다. 만드는 방법은 간단하다. Controller 위에 @RestController 어노테이션을 붙여주면 된다.
물론 WebMvcContextConfiguration에서 @ComponentScan을 활용해 controller들을 찾아주는 작업은 선행되어 있어야 하지만 그거까지 적는건 너무 심하게 삼천포로 빠지는 거니 스프링 구성은 추후 따로 포스팅 하는걸로 하고.. 이 포스팅을 찾아 들어온 분들은 JSON응답이 마음같이 안되고 있을뿐, 컨트롤러는 기본적으로 잘 작동하고 있을거라 믿고 간다.
아무튼 이후엔 응답할 내용을 담은 DTO 클래스를 만들고 Getter , Setter를 세팅해준다.
아래도 그냥 위의 멤버 변수들의 게터 세터 뿐이라 전체 스샷은 찍지 않았다. 다만 여기서 언급하고 싶은 게 있는데 바로 @JsonInclude 어노테이션이다.
- @JsonInclude
이를 설명하기 위해선.. 일단 이 클래스를 사용해 응답한 Web Api 내역들을 한번씩 보자!
어차피 샘플 데이터라 내용은 중요하지 않다. 빨간줄 쳐진 부분만 보면 된다. 사실 이 갯수만 봐도 된다.
이 모든 API는 위에 생성한 Response 클래스 하나만 활용해 리턴한 값들이다. 이상하지 않은가? Response클래스에 제네릭을 선언해놨으니 각각의 내용들이야 다를 수 있다쳐도 items, totalCount 등등의 DTO에 선언한 멤버 변수의 이름은 값이 null이든 0이 들어가든 있긴 해야 할텐데 어떤 건 items만 있고, 어떤건 items와 totalCount만 있고 어떤건 전부 있고 하는게..?
그게 바로 JsonInclude의 역할이다. 이 Response Dto는 지금 클래스 자체에 JsonInclude.Include.NON_EMPTY@JsonInclude(JsonInclude.Include.NON_EMPTY)를 선언하여 배열이 비어있을 경우 아예 Json으로 반환하지 않도록 했고, totalCount나 averageScore 위에는 @JsonInclude(JsonInclude.Include.NON_DEFAULT)를 선언해 기본 값, 그러니까 0이나 0.0이 값으로 들어올 경우 Json으로 반환하지 않도록 한 것이다.
이외에도 여러가지 기능이 있는데 이는 ( https://alwayspr.tistory.com/31 ) 에 잘 정리되어 있다.
아무튼 이런 기능을 잘 활용하면
이렇게 별다른 처리 없이 Response 클래스 하나만 리턴해도 위 스크린샷에 보이듯 응답이 JSON으로 잘 간다
아무튼 Spring 생태계는 정말 편하다!
반응형'Knowledge > Spring' 카테고리의 다른 글
스프링에서 파일다운로드 구현하는 방법 (0) 2019.09.20 스프링에서 컨트롤러로 넘어온 파일 저장하는 방법 (0) 2019.09.18 스프링에서 로그를 남겨보자! SLF4J와 Logback (0) 2019.09.18 로그인 기능은 어떻게 구현할까? 세션에 대해 알아보자 (0) 2019.09.04 스프링 controller에서 파라미터를 받는 다양한 방법 ( @RequestParam, @RequestBody, @PathVariable) (0) 2019.09.04