Light Blue Pointer
본문 바로가기
Developing/TIL(Develop)

Jackson이란 무엇일까

by Greedy 2023. 11. 6.

스프링이 3.0 이후로 Jackson과 관련된 API를 제공해서 우리가 코드를 직접 작성해서 JSON 데이터를 처리하지 않아도 된다고 함

external libraries 에 jackson이라는 라이브러리가 자동으로 추가되어있음

따로 dependencies에 추가하지 않아도 이미 사용하고 있음

스프링에서 처리되는거 이외에도 직접 코드를 사용해서 JSON 형태로 바꾼다거나 JSON 형태로 넘어온 Object를 바꿔줘야 하는 경우가 종종 생김

test→ JacksonTest 만듦

package com.sparta.springmvc;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.sparta.springmvc.response.Star;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

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);
    }
    @Test
    @DisplayName("JSON To Object : 기본 생성자 & (get OR set) Method 필요")
    void test2() throws JsonProcessingException {
        String json = "{\\"name\\":\\"Robbie\\",\\"age\\":95}"; // JSON 타입의 String

        ObjectMapper objectMapper = new ObjectMapper(); // Jackson 라이브러리의 ObjectMapper

        Star star = objectMapper.readValue(json, Star.class);
        System.out.println("star.getName() = " + star.getName());
    }
}
@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);//Object를 Json으로

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

Get method 필요 → 변환을 할때 Getter를 사용한다 함

//@Getter
public class Star {
    String name;
    int age;

    public Star(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Star() {}
}

Star클래스에서 Getter를 주석처리하면

Test가 작동하지 않는다

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class com.sparta.springmvc.response.Star and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)

No serializer found → serialize : 객체 형태의 값을 String값으로 바꿈(Object to JSON) 하는 것

무조건 변환이 가능한 게 아니라 Object Mapper로 사용할때 Getter등과 같이 필요한 요구조건들이 있음

@Test
    @DisplayName("JSON To Object : 기본 생성자 & (get OR set) Method 필요")
    void test2() throws JsonProcessingException {
        String json = "{\\"name\\":\\"Robbie\\",\\"age\\":95}"; // JSON 타입의 String

        ObjectMapper objectMapper = new ObjectMapper(); // Jackson 라이브러리의 ObjectMapper

        Star star = objectMapper.readValue(json, Star.class);// Star.class: Star 객체로 만들거라고 지정
        System.out.println("star.getName() = " + star.getName());
				System.out.println("star.getAge() = " + star.getAge());
    }

 

 

기본생성자를 주석처리해봄

@Getter
public class Star {
    String name;
    int age;

    public Star(String name, int age) {
        this.name = name;
        this.age = age;
    }
//
//    public Star() {}
}

그리고 Test2를 수행하면

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of com.sparta.springmvc.response.Star (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)

이런 에러가 뜬다

deserialize : Sting→Object

Getter를 주석처리하고 Test2를 수행하면

내부적으로 Getter를 사용하기 때문에 field가 없다고 에러가 뜸

Setter를 Getter 대신 달아주면 동작함

name 에서 e를 빼고 돌려봄

void test2() throws JsonProcessingException {
        String json = "{\\"nam\\":\\"Robbie\\",\\"age\\":95}"; // JSON 타입의 String

        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());
    }

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "nam" (class com.sparta.springmvc.response.Star), not marked as ignorable (2 known properties: "name", "age"]) 이런 에러가 뜨게 됨

필드명과 정확하게 일치해야 인식할 수 있다 함

협업할 때 주의해야 한다고 함