스프링부트 입문 8. Object Mapper

min seung moon·2021년 6월 26일
0

Spring

목록 보기
25/50

1. 프로젝트 세팅

  • main이 아닌 test에서 test

2. 프로젝트 작성

01. Object Mapper

  • TEXT JSON -> Object
  • Object -> TEXT JSON
  • controller req json(text) -> object
  • response object -> json(text)
  • object mapper get method(getter)를 활용
      • Object Mapper는 get()을 참조
  • object mapper는 default 생성자를 필요로 한다
    • Object Mapper는 defualt constructor을 참조

02. 객체 생성

  • main에 User 클래스 생성
    • User.java
package com.example.objectmapper;

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

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

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

03. object -> text

-1. first test

  • test / ObjectMapper.ApplicationTests.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("---------------");

		// TEXT JSON -> Object
		// Object -> TEXT JSON

		// controller req json(text) -> object
		// response object -> json(text)

		var objectMapper = new ObjectMapper();

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

		var text = objectMapper.writeValueAsString(user);
		System.out.println(text);
		// text -> object
	}

}

-2. get Error

  • 실행 Error
    • Object Mapper는 get()을 참조

-3. update code

  • main / User.java
    • getter 추가
package com.example.objectmapper;

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

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

    public String getName() {
        return name;
    }

    public Integer getAge() {
        return age;
    }

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


04. text -> object

-1. first test

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

		// TEXT JSON -> Object
		// Object -> TEXT JSON

		// controller req json(text) -> object
		// response object -> json(text)

		var objectMapper = new ObjectMapper();

		// object -> text
		// object mapper get method를 활용
		var user = new User("steve", 10);

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

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

}

-2. get Error

  • 실행 에러
    • Object Mapper는 defualt constructor을 참조

-3. update code

  • User.java
package com.example.objectmapper;

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

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

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


    public String getName() {
        return name;
    }

    public Integer getAge() {
        return age;
    }

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


05. 주의점

  • 특정 클래스에다가 get/set method 말고 특정 메소드를 추가하는 경우가 있다
    • 간혹 getter 이 외에 get으로 시작하는 method를 만들 경우가 있다
    • 하지만 사용하는 객체가 object mapper가 해당 클래스에서 시리얼라이즈/디시리얼라이즈를 하면 오류가 발생한다
    • 그렇기에 object mapper에 활용되는 클래스에서는 get이라는 이름을 사용하지 않는게 좋다


06. snake_case 추가

  • User.java
package com.example.objectmapper;

import com.fasterxml.jackson.annotation.JsonProperty;

public class User {
    private String name;
    private Integer age;
    @JsonProperty("phone_number")
    private String phoneNumber;

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

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

    public String getName() {
        return name;
    }

    public Integer getAge() {
        return age;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

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

  • json으로 처리될 때, object로 처리 될 때 case 전환에 문제 없음 확인
  • 값 넣어도 문제 없음


profile
아직까지는 코린이!

0개의 댓글