Spring/Spring 입문

8. Object Mapper

개발자잡 2022. 6. 30. 17:06

Object mapper는 Text Json을 Object로 바꿔주고 Object를 Json으로 바꿔준다.

컨트롤러에서 Json 요청이 들어오면 object로 바꿔주고 response object를 Json(text)로 변환해왔다.

이 것을 직접 객체로 생성해서 활용할 수 있는 방법을 알아보았다.

 

package com.example.objectmapper;

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


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

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

객체를 생성해주고

package com.example.objectmapper;

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

        //object -> text
        var user = new User("steve", 10);

        var text = objectMapper.writeValueAsString(user);
        System.out.println(text);



        //text -> object

    }

}

 

value를 string으로 바꾸는 방식으로 작성해보았다.

 

오류가 났다.

왜 오류가 났을까.

 

1. ObjectMapper는 GET 메서드를 참조한다.

USER에 GET 메서드를 추가했다.

 

public String getName() {
    return name;
}

public int getAge() {
    return age;
}

정상적으로 Object가 출력되었다.

정리: Object mapper는 get method를 활용함을 알 수 있다.

 

반대로 가보자.

var objectUser = objectMapper.readValue(text, User.class);

objectUser는 readValue라는 메서드안에는 첫 번째 인자에는 데이터를, 두 번째 인자에는 어떠한 클래스 타입으로 바꿔줄 건지 class를 넣어주면 된다.

 

생성자가 없다고 오류가 나었다.

오브젝트 매퍼는 default 생성자가 필요하다.

public  User(){
    this.name = null;
    this.age = 0;
}

정상적으로 object가 Json으로 Json이 오브젝트로 변환되었다.

text가 Object로 바꿀 때 object mapper는 defualt 생성자를 필요로 한다.

 

오브젝트 메퍼가 참조하는 클래스는 get 메서드가 참조됨을 알 수 있었다.

 

SnakeCase 같은 것을 활용 할 때는 여기서도 @JsonProperty를 사용한다.

 

스네이크 케이스 카멜 케이스 둘다 적용된다.

 

컨트롤러 외에 작업해야 할 때 objectMapper를 생성하여 writeValueAsString 이나 readValue를 통해 object를 json으로  json으로 object로 변환이 가능하다.

 

최종 코드

package com.example.objectmapper;

import com.fasterxml.jackson.annotation.JsonProperty;

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

    @JsonProperty("phone_number")
    private String phoneNumber;


    public  User(){
        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 String getPhoneNumber() {
        return phoneNumber;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public User DefaultUser(){
        return new User("default", 0, "010-1111-2222");
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", phoneNumber='" + phoneNumber + '\'' +
                '}';
    }
}
package com.example.objectmapper;

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

        //object -> text
        var user = new User("steve", 10, "010-1111-2222");

        var text = objectMapper.writeValueAsString(user);
        System.out.println(text);



        //text -> object
        var objectUser = objectMapper.readValue(text, User.class);
        System.out.println(objectUser);

    }

}