👩🏻‍💻 Programming/SpringBoot

SpringBoot의 Object Mapper

한국의 메타몽 2021. 8. 5. 02:46

 

Object Mapper란?

 

Object Mapper는 데이터의 형식을 변환해준다.

Java에서는 보통 Jackson databind를 통해 테이터의 형식을 변환해준다.

SpringBoot에서 ObjectMapper는 아래 예시와 같이 데이터의 형식을 변환해준다.

 

  • Text(Json) -> Object
  • Object -> Text(Json)

 

예를들어 아래와 같이 Controller내부에서 Object를 Json으로 바꿀 수 있다.

    @PostMapping("/json")
    public User json(@RequestBody User user){
        return user;
    }
    /*
    이때 Text타입은 API Platform에서 'Json'으로 지정해준다.
    */

Postman의 결과

 

위 코드는 아래의 과정을 거쳐 Object를 Json으로 바꿔준다.

Request(위에서는 RequestBody) -> Object Mapper -> Object -> Method -> Object -> Object Mapper -> Json -> Response

이때 중간에 사용된 Object Mapper가 Object를 Json으로 변환해준다.

 

 

Controller를 거치지 않고 쉽고 빠르게 Object Mapper를 사용하기

 

먼저 아래 두 케이스에서 공통으로 사용할 User클래스는 다음과 같다.

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 String getPhoneNumber() {
        return 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 getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

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

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

 

 

1. Object -> Text(Json)

		// object -> Text
		// object mapper가 get method를 활용한다
        	// object mapper는 default 생성자를 필요로 한다.
		var user = new User("DM",26,"010-1234-1234");
		var text = objectMapper.writeValueAsString(user);
		System.out.println(text);

default 생성자가 없으면 object mapper가 동작되지 않으니 default생성자를 만들어주자.

    // User 클래스 내부에 Default 생성자를 추가해준다.
    public User(){
        this.name = null;
        this.age = 0;
        this.phoneNumber = null;
    }

Console창 내부로 잘 출력됐다.

 

 

2. Text(Json) -> Object

		// text -> object
		// object mapper는 default 생성자를 필요로 한다.
		var objectUser  = objectMapper.readValue(text, User.class);
		System.out.println(objectUser);

default 생성자가 없으면 object mapper가 동작되지 않으니, 위와 동일하게 default생성자를 만들어주자.

    // User 클래스 내부에 Default 생성자를 추가해준다.
    public User(){
        this.name = null;
        this.age = 0;
        this.phoneNumber = null;
    }

 

Console창 내부에 잘 출력됐다.

 

 


 

 

+ 자신만의 메소드를 만들때

    public User DefaultUser(){ // O
        return new User("default",0,"111-2222-2222");
    }
    
    public User getDefaultUser(){ // X
        return new User("default",0,"111-2222-2222");
    }

 

get-set말고 자신이 만든 특정 method를 추가할때 주의할 사항이 있다.

Object Mapper를 활용하는 경우, Object Mapper를 활용하는 클래스 내부의 특정 method에 get이나 set을 붙이면 안된다.

붙이면 오류가 발생하는데, 이는 Object Mapper가 get-set 메소드를 활용하기 때문에 잘못 읽어들여 오류를 발생시키기 때문이다.

발생하는 오류의 예시로는 Object Mapper가 대상을 두 번 읽어들이는 경우가 있고, JSON parse error: Cannot deserialize instance of `java.lang.String` out of START_OBJECT token; 가 발생하는 경우도 있다.