8. Object Mapper
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 mapper는 get method를 활용함을 알 수 있다.
반대로 가보자.
var objectUser = objectMapper.readValue(text, User.class);
objectUser는 readValue라는 메서드안에는 첫 번째 인자에는 데이터를, 두 번째 인자에는 어떠한 클래스 타입으로 바꿔줄 건지 class를 넣어주면 된다.
오브젝트 매퍼는 default 생성자가 필요하다.
public User(){
this.name = null;
this.age = 0;
}
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);
}
}