Spring

Object Mapper

개발자 김혜린 2022. 4. 23. 16:54

Object Mapper가 하는 일 :

1. TEXT 형태의 JSON -> Object로 바꿔줌

2. Object -> TEXT 형태의 JSON로 바꿔줌

 

Object Mapper의 예 : 

1. Controller에서, TEXT 형태의 JSON 요청이 들어오면 자동적으로 Object로 바꿔줬었음 

2. Responses를 Object로 리턴하게 되면, 자동적으로 TEXT 형태의 JSON으로 바꿔줬었음

 

이번엔 직접 Object Mapper를 객체로 만들어서 사용해보자

 

첫 번째로는 Object -> TEXT 형태의 JSON

두 번째로는 TEXT 형태의 JSON -> Object

 

만약 위와 같은 예를 사용해야 할 때는,

ObjectMapper를 적극 활용하자!

 

package com.example.object_mapper;

import com.fasterxml.jackson.annotation.JsonProperty;

public class User {
    private String name;
    private int age;

    @JsonProperty("phone_number")
    private String phoneNumber;

    public User(){ //(2) 예시의 기본 생성자 추가해줌
        this.name=null;
        this.age=0;
        this.phoneNumber=null;
    }

    public User(String name, int age,String phoneNumber){ //생성자 오버로딩
        this.name=name;
        this.age=age;
        this.phoneNumber=phoneNumber;
    }

    public User getDefaultUser(){ //특정 클래스에 get 메소드가 아니라 이런 메소드를 만들 때도 있음
        return new User("defult",0,"010-1111-2222"); //클래스 이름에 get을 붙여버리면 object mapper가 착각하므로,
        //내가 object mapper를 활용하려면 클래스에 get이 붙은 메소드를 만들면 안된다.
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

 

package com.example.object_mapper;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class ObjectMapperApplicationTests {

    @Test
    void contextLoads() throws JsonProcessingException {
        System.out.println("---------------------");

        var objectMapper = new ObjectMapper(); //직접 객체로 만들어서 활용해보자

        // (1) object->TEXT
        var user = new User("steve",10,"010-1111-2222"); //생성자 오버로딩으로 객체 초기화
        var text = objectMapper.writeValueAsString(user);
        System.out.println(text);
        //실행 -> 에러남
        //object->TEXT 할 때, object mapper는 get 메소드를 활용한다. -> User 클래스에 getter 메소드 만들어줌


        // (2) TEXT->object
        var objectUser = objectMapper.readValue(text, User.class); //인자에 처음엔 Json 넣어주고, 어떤 클래스 오브젝트를 만들것인지 넣어줌
        System.out.println(objectUser);
        //실행 -> 에러남
        //생성자 오버로딩을 했기 때문에 현재 기본 생성자가 없다.
        //TEXT 형태의 JSON -> Object 할 때, object mapper를 실행하려면 기본 생성자가 있어야 한다.
    }

}