티스토리 뷰

반응형

object mapper란 텍스트 형태의 JSON을 object로 변경해 주거나 object를 텍스트 형태의 JSON으로 변경해 주는 것을 의미한다. 예를 들면 컨트롤러에 요청이 오면 JSON을 object로 변경을 했고, 응답으로 보내면 자동으로 object를 json으로 변경했다.

 

컨트롤러를 사용하지 않고 직접 object를 활용하여 사용하는 방법을 알아보자.

 

 

 

아래와 같이 자유롭게 프로젝트를 만들고 Dependencies는 Spring web을 설정한다.

 

 

 

코드는 main에 작성하지 않고 test에 작성하여 간략하게 알아보자. 아래와 같이 잘 적성하나 간단한 문장을 프린터 해보자.

 

 

실행을 시켜보면, Test 부분에 아래와 같이 뜨는 것을 확인 할 수 있다.

 

 

 

 

object mapper를 생성하자. 그래서 object를 text로 변경하는 것과 text를 object로 변경하는 방식을 알아보자.

 

var objectMapper = new ObjectMapper();

 

우선적으로 objectmapper를 위와 같이 생성하자. 우선 object를 아래와 같이 생성하자. 아래는 User 클래스는 만든 것이다.

 

 

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 +
                '}';
    }
}

 

User 클래스를 만들어서 object를 만들어 주기위한 준비가 끝났다. 하지만 위의 방식으로만으로는 에러가 난다.

 

 

주의사항

1. Object method는 get method를 참조한다. User class에서 getter만 generate 해준다. 

 

 

ObjectMapperApplicationTests.java

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

        // 객체 -> text
        var user = new User("steve", 30);

        // objectMapper.as 까지만 치고 writevalueAsString찾아서 엔터를 치자
        // writevalueAsString에서 빨간 출이 보이는 이유는 변환 시 예외가 될 수 있기 때문이다.
        // writeValueAsString에서 alt+enter 해서 enter 한번더 하면 위에 
        // throws가 적히는 것을 알 수 있다.
        var text = objectMapper.writeValueAsString(user);
        System.out.println(text);
    }

}

 

User.java

 

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

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

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

 

실행하면, 관련 값이 아래와 같이 출력되는 것을 알 수 있다.

 

 

 

 

텍스트를 object로 변경하기

 

주의사항 : 여기서 objectmapper의 특징은 동작하기 위해서 디폴트 생성자가 있어야한다.

 

ObjectMapperApplicationTests.java

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

        // 객체 -> text
        var user = new User("steve", 30);

        // objectMapper.as 까지만 치고 writevalueAsString찾아서 엔터를 치자
        // writevalueAsString에서 빨간 출이 보이는 이유는 변환 시 예외가 될 수 있기 때문이다.
        // alt+enter 해서 enter 한번더 하면 위에 throws가 적히는 것을 알 수 있다.
        var text = objectMapper.writeValueAsString(user);
        System.out.println(text);


        // text -> 객체
        // 넣은 옵션의 뜻은 text를 User.class로 변경하겠다는 의미이다.
        // object mapper는 default 생성자를 필요로 한다.
        var objectUser = objectMapper.readValue(text, User.class);
        System.out.println(objectUser);
    }

}

 

 

User.java

package com.example.objectmapper;

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


    // text를 object로 변경 시. 디폴트 생성자 필수다.
    public User(){
        this.name = null;
        this.age = 0;
    }

    // 생성자 하나 만들어 주자
    public User(String name, int age){
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

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

 

 

 

주의!!

내가 작성한 클래스가 object mapper에서 활용이 된다고 할 때, 아래와 같이 get이라고 붙여주면 에러가 발생한다.

 

// error 발생
public User getdefaultUser(){
    return new User("default", 0)
}

 

get을 빼고 그냥 defaultUser라고 붙여줘야 object mapper가 정상적으로 작동한다.

 

// 정상
public User defaultUser(){
    return new User("default", 0);
}

 

 

 


 

JsonProperty 적용하기

> 그렇게 어려운 것은 없다.

 

    @JsonProperty("phone_number")
    private String phoneNumber;


    // get method 추가해주기
    public String getPhoneNumber() {
	    return phoneNumber;
    }

    // 디폴트 생성자에 null 추가
    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;
    }
    
    // defaultUser도 넣어준다.
    public User defaultUser(){
        return new User("default", 0, "010-1111-1111");
    }
    
    // override도 다시 추가
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", phoneNumber='" + phoneNumber + '\'' +
                '}';
    }

 

 

ObjectMapperApplicationTests.java

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

        // 객체 -> text
        var user = new User("steve", 30, "010-0000-0000");

        // objectMapper.as 까지만 치고 writevalueAsString찾아서 엔터를 치자
        // writevalueAsString에서 빨간 출이 보이는 이유는 변환 시 예외가 될 수 있기 때문이다.
        // alt+enter 해서 enter 한번더 하면 위에 throws가 적히는 것을 알 수 있다.
        var text = objectMapper.writeValueAsString(user);
        System.out.println(text);


        // text -> 객체
        // 넣은 옵션의 뜻은 text를 User.class로 변경하겠다는 의미이다.
        // object mapper는 default 생성자를 필요로 한다.
        var objectUser = objectMapper.readValue(text, User.class);
        System.out.println(objectUser);
    }

}

 

 

 

User.java

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;



    // text를 object로 변경 시. 디폴트 생성자 필수다.
    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-1111");
    }

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

 

 

결과값 확인하면, snake_case에서도 잘 동작하고 반대로 camelCase에서도 잘 동작하는 것을 아래에서 확인 가능하다.

 

 

 

 

정리

Controller 외에 내가 따로 작업을 하거나, 객체를 JSON으로 바꿔야한다면, 위와 같이 var objectMapper를 생성해서 writeValueAsString이나 readValue를 활용하여 JSON <-> object 간의 변환이 가능하다. 이 외의 objectMapper에 추가하는 방식도 있다는 점을 이해하자.

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함