ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring에서 JSON을 편하게 리턴해보자! Jackson 라이브러리와 RestController
    Knowledge/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 생태계는 정말 편하다!

    반응형

    댓글

Designed by Tistory.