매우 오랜만이다.
손가락 골절 덕분에 키보드를 한 손으로 조작하기가 쉽지가 않았다.
Spring Boot에서 제공하는 Jackson의 Object Mapper를 보겠다.
클래스의 멤버를 확인하거나 parsing하는데 조작이 필요한 경우가 존재한다.
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시 기본 생성자를 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를 사용해주면 되겠다.