[Spring] Object Mapper

HOJUN·2024년 6월 5일

Backend - Spring

목록 보기
6/34

매우 오랜만이다.
손가락 골절 덕분에 키보드를 한 손으로 조작하기가 쉽지가 않았다.

Spring Boot에서 제공하는 Jackson의 Object Mapper를 보겠다.

클래스의 멤버를 확인하거나 parsing하는데 조작이 필요한 경우가 존재한다.

WriteValue

dto를 json으로 직렬화하는 경우에 objectMapper의 write를 사용할 수 있다.

var user = new UserRequest();
user.setUserName("홍길동");
user.setUserAge(10);
user.setEmail("Hong@Gil.dong");
user.setKorean(true);

다음과 같이 만들어진 user 객체를 json으로 직렬화하고 싶다면

var json = objectMapper.writeValueAsString(user);


json 데이터로 직렬화가 가능하다.

또 객체의 멤버와 json의 이름을 매핑할 수 있다.
objectMapper는 변수의 이름을 매핑하는 것이 아니라 메소드를 보고 매핑을 수행한다.

UserRequest의 클래스에 있는 getter를 살짝 추가해보면

public String getUser(){
        return this.userName;
    }


user라는 이름의 값이 추가되었다.
하지만 사용하고 싶지 않은 멤버이면 @JsonIgnore를 추가할 수 있다.

특정 형태의 이름으로 매핑하고 싶으면
@JsonProperty("userName")처럼 지정해줄 수 있다.

ReadValue

만약 readValue시 기본 생성자를 private으로 선언해놔도 object mapper는 리플렉션 기반으로 인스턴스 생성이 가능하다.

var json = "{\"user_name\":\"홍길동\",\"user_age\":10,\"email\":\"Hong@Gil.dong\",\"is_korean\":true}";

해당 json 데이터를 직접 dto로 역직렬화를 시도한다면 위 이미지와 같이 매핑이 실패한다.
VO클래스에 @Setter를 지정해주면

멤버마다 setter메소드가 만들어지고

잘 매핑된다.

대신 다른 점은 Getter를 지정해줘도 잘 매핑된다는 것인데,
json 데이터의 이름을 user_names라는 이름으로 바꾼다면 매핑이 실패한다.
그래서 강제적으로 setter메소드를 해당 이름으로 만들어야 매핑된다.

그런데 우리는 lombok을 사용하기 때문에 setter를 만들 필요가 없고 그저 변수 선언부에 @JsonProperty를 지정해주면 된다.

물론 우리는 @Getter, @Setter도 사용하지 않고 기본 어노테이션을 사용할 것이므로
예외상황만 @JsonProperty를 사용해주면 되겠다.

0개의 댓글