본문 바로가기
Spring

[Spring] Jackson 이란 무엇인가?

by worldcenter 2024. 9. 26.

Jackson이란 Json 데이터 구조를 처리해주는 라이브러리 입니다. Spring은 3.0버전 이후로 Jackson과 관련된 API를 제공함으로써, 우리가 직접 소스 코드를 작성하여 Json 데이터를 처리하지 않아도 자동으로 처리해주고 있습니다.

SpringBoot의 starter-web 에서는 default로 Jackson 관련된 라이브러리들을 제공하고 있습니다.

  • Object -> Json 타입의 String
  • Json 타입의 String -> Object

직접 Json 데이터를 처리해야 할 때는 Jackson 라이브러리의 ObjectMapper를 사용할 수 있습니다.

 

Object To Json

  • ObjectMapper의 writeValueAsString() 메서드를 사용하여 변환
  • Object를 Json 타입의 String으로 변환하기 위해서는 해당 Object에 get Method가 필요
// Star 클래스
@Getter
@AllArgsConstructor
public class Star {
    private String name;
    private int age;
}
public class JacksonTest {

    @Test
    @DisplayName("Object To Json : get Method 필요")
    void test1() throws JsonProcessingException {
        Star star = new Star("Robbie", 95);

        ObjectMapper objectMapper = new ObjectMapper(); // Jackson 라이브러리의 ObjectMapper
        String json = objectMapper.writeValueAsString(star);

        System.out.println("json = " + json);
    }
}

 

만약 get Method가 없다면 어떻게 될까요? @Getter 어노테이션을 삭제하고 Test를 재실행하면 다음과 같은 에러메시지가 발생합니다.

serializer(직렬화)에 대한 내용은 다음 링크에서 확인 가능합니다.

// Star 클래스
// @Getter
@AllArgsConstructor
public class Star {
    private String name;
    private int age;
}
No serializer found for class com.sparta.springmvc.response.Star and no properties discovered to create BeanSerializer

 

 

Json To Object

  • ObjectMapper의 readValue() 메서드를 사용하여 변환
  • 첫 번째 파라미터는 JSON 타입의 String, 두 번째 파라미터는 변환할 Object의 class 타입
  • Json 타입의 String -> Object로 변환하기 위해서는 해당 Object에 기본 생성자get 혹은 set 메서드가 필요
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class Star {
    private String name;
    private int age;
}
public class JacksonTest {

    @Test
    @DisplayName("Json To Object : 기본 생성자 & (Getter || Setter) 필요")
    void test2() throws JsonProcessingException {
        String json = "{\"name\" : \"Robbie\", \"age\" : 95}";

        ObjectMapper objectMapper = new ObjectMapper(); // Jackson 라이브러리의 ObjectMapper
        Star star = objectMapper.readValue(json, Star.class);

        System.out.println("star.getName() = " + star.getName());
        System.out.println("star.getAge() = " + star.getAge());
    }


}

 

만약 기본 생성자나 get 혹은 set 메서드가 없는 경우 어떻게 될까요? Start 클래스에서 @NoArgsConstructor 어노테이션을 삭제하고 Test를 재실행하면 다음과 같은 에러메시지가 발생합니다.

deserializer(역직렬화)에 대한 내용은 다음 링크에서 확인 가능합니다.

cannot deserialize from Object value