[웹 개발] Eclipse REST API 구현 - JSON 형식 리턴하기

    728x90

    안녕하세요

    로로봉입니다 : )

    REST API에서 Json 으로 리턴하는 방법을 알아보도록 하겠습니다.


    1) Jackson 기본 구조

    Spring Boot에는 JSON 구조를 간편하게 만들어 사용할 수 있는 Jackson이라는 라이브러리를 사용할 수 있습니다.

    Jackson 라이브러리는 어노테이션을 사용하여 class 변수를 자동으로 json 형태로 변환해 줍니다.

    @RestController 이렇게 생긴 것들을 어노테이션이라고 말합니다. 어노테이션마다 다양한 기능이 제공되고 있습니다.

    Jackson 라이브라리를 통해 json으로 변환하기 위해서는 아래 2가지만 충족되면 됩니다.

    1) Class에 @RestController가 있어야함
    2) Class에 @Controller가 붙어있다면 Function에 @ResponseBody가 있어야함

    Jackson 라이브러리를 사용해보도록 하겠습니다.

    우선 info 패키지에서 우측 마우스를 눌러 New - Package를 선택해줍니다.

    [ 그림 1 : 패키지 생성 선택 ]

    아래와 같이 info 아래 model이라는 패키지를 만들어 줍니다.

    [ 그림 2 : model 패키지 생성 ]

    생성된 패키지 안에 Class를 추가해줍니다.

    [ 그림 3 : 클래스 생성 ]

    클래스 이름을 Project로 입력하고 Finish 버튼을 눌러줍니다.

    [ 그림 4 : Project 클래스 생성 ]

    Project 클래스가 만들어지면 아래와 같이 작성해줍니다.

    @Getter와 @Setter 어노테이션이 class 위에 정의되어 있어야 합니다.

    package com.rorobong.restapi.info.model
    
    import lombok.Getter;
    import lombok.Setter;
    
    @Getter
    @Setter
    public class Project {
       public String projectName;
       public String author;
       public Date createDate;
    }

    Date 형식이 import되지 않아서 오류가 나는 것을 볼 수 있습니다.

    [ 그림 5 : Date 변수 오류 ]

    Ctrl + Shift + O 눌러서 java.util.Date를 임포트 해줍니다.

    [ 그림 6 : 자동 import java.utilDate ]

    Date 변수의 패키지가 import가 되면 오류가 사라집니다.

    [ 그림 7 : 작성 완료 ]

    이제 InfoController.java 파일을 아래와 같이 수정해줍니다.

    @RestController
    public class InfoController {
    
       @GetMapping("/info");
       public Object projectInfo() {
          Project prj = new Project();
          prj.projectName = "restapi";
          prj.author = "rorobong";
          prj.createDate = new Date();
          return prj;
       }
    }

    Date 메소드에 대한 패키지가 없어서 또 다시 오류가 발생합니다.

    [ 그림 8 : InfoController Java 소스 ]

    Ctrl + Shift + O 를 눌러서 java.util.Date를 추가해줍니다.

    [ 그림 9 : Date 임포트 ]

    임포트가 되면 오류가 사라지는 것을 볼 수 있습니다.

    [ 그림 10 : InfoController 소스 작성 완료 ]

    이제 프로젝트를 빌드해보겠습니다.

    [ 그림 11 : 프로젝트 빌드 ]

    Spring Boot가 실행 후에 크롬 브라우저에서 호출해 보았습니다.

    별도의 JSON 형식으로 만들어준 것 없이 Jackson 라이브러리가 Object 객체를 자동으로 JSON으로 변환해준 것을 볼 수 있습니다.

    [ 그림 12 : 호출 결과 ]


    2) Jackson Annotation 몇가지

    이제 몇가지 어노테이션에 대해 알아보도록 하겠습니다.

    // 해당 property를 return에서 제외시킵니다.
    @JsonIgnore
    
    // Null이 아닌 것만 return에 포함시킵니다.
    // (ALWAYS : 항상 포함)
    // (NOT_EMPTY : Null 또는 빈 데이터가 아닌 경우 포함)
    // (NOT_NULL : Null이 아니면 포함)
    // (NOT_DEFAULT : bean의 기본생성자로 정의된 필드값과 다르게 변경된 필드만 포함)
    @JsonInclude(JsonInclude.Include.NON_NULL)
    
    // class의 property name 그대로 보여주지 않고 변경하여 보여줍니다.
    @JsonProperty(value = "default")
    
    // 날짜, 시간 값을 직렬화할 때 형식을 지정
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")

    우선 @JsonIgnore에 대해 적용해보도록 하겠습니다. createDate를 제외시켜보았습니다.

    [ 그림 13 : @JsonIgnore 적용 ]

    다시 빌드하여 호출해보면 createDate가 사라진 것을 볼 수 있습니다.

    [ 그림 14 : @JsonIgnore 호출 결과 ]

    두번째로 @JsonInclude 어노테이션을 적용해보겠습니다.

    [ 그림 15 : @JsonInclude 적용 ]

    author을 null값으로 만들고 빌드해 주었습니다.

    [ 그림 16 : author null로 변경 ]

    /info를 호출해보면 author에 null이 들어가 있기 때문에 author이 없어진 것을 볼 수 있습니다.

    [ 그림 17 : @JsonInclude 적용 호출 결과 ]

    세번째로 @JsonProperty 어노테이션을 적용해보겠습니다.

    다시 author에 null이 아닌 "rorobong"을 넣어주고 Project 클래스에 아래와 같이 author에 대해 value를 default로 지정해 주었습니다.

    [ 그림 18 : @JsonProperty 적용 ]

    결과는 author로 보여지는 것이 아니라 author이 default로 표시되는 것을 볼 수 있습니다.

    [ 그림 19 : @JsonProperty 적용 호출 결과 ]

    마지막으로 @JsonFormat 어노테이션을 적용해보겠습니다.

    날짜 앞에 아래와 같이 날짜 형식을 넣어주면 됩니다.

    [ 그림 20 : @JsonFormat 적용 ]

    기존에는 초단위 까지 나왔었지만 형식을 넣고 호출하면 아래와 같이 년도-월-일로 표시되는 것을 볼 수 있습니다.

    [ 그림 21 : @JsonFomat 적용 호출 결과 ]


    3) GSON

    GSON 라이브라리를 사용하면 Jackson 라이브러리 처럼 class를 만들지 않고, 직접 JSON을 만들어서 보낼수 있습니다.

    GSON 라이브러리를 사용하기 위해서 build.gradle의 dependencies에 아래 코드를 추가해 주어야 합니다.

    implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.5'

    [ 그림 22 : GSON 설정 추가 ]

    추가 후 아래와 같이 Gradle Refresh를 해줍니다.

    [ 그림 23 : Gradle Refresh 처리 ]

    GSON을 사용하여 JSON 데이터가 호출되도록 하기 위해 info 패키지에 클래스 하나를 추가해줍니다.

    [ 그림 24 : info 패키지 클래스 추가 ]

    클래스 이름은 InfoController2로 입력 후 Finish 버튼을 눌러줍니다.

    [ 그림 25 : InfoController2 클래스 생성 ]

    아래와 같이 클래스를 작성해줍니다.

    @RestController
    public class InfoController2 {
    
       @GetMapping("/info2")
       public String projectInfo2() {
          JsonObject jo = new JsonObject();
          
          jo.addProperty("projectName", "restapi");
          jo.addProperty("author", "rorobong");
          jo.addProperty("createDate", new Date().toString());
          
          JsonArray ja = new JsonArray();
          for(int i=0; i<5; i++) {
             JsonObject jObj = new JsonObject();
             jObj.addProperty("prop "+i, i);
             ja.add(jObj);
          }
          
          jo.add("array", ja);
          
          return jo.toString();
       }
    }

    위와 같이 작성하면 Date 관련 패키지가 임포트 안되어 또 다시 오류가 발생합니다.

    [ 그림 26 : Date() 메소드 오류 ]

    Ctrl + Shift + O를 눌러 자동으로 import 되도록 해줍니다. java.util.Date를 추가해줍니다.

    [ 그림 27 : Date 패키지 임포트 ]

    java.util.Date가 임포트 되면서 오류가 사라졌습니다.

    [ 그림 28 : InfoController2 작성 완료 ]

    이제 빌드 후에 크롬에서 /info2 를 호출하시면 아래와 같이 GSON으로 생성한 JSON 데이터가 출력되는 것을 볼 수 있습니다.

    [ 그림 29 : InfoController2 호출 결과 ]

     

    공감 ♥ + 구독 부탁드립니다 : )

    728x90
    반응형

    댓글