ObjectMapper를 자바에서 JSON과 객체 간의 변환을 담당하는 도구라고 생각해보자. 객체를 JSON으로 변환할 때는 이 객체에 들어있는 정보를 JSON 형식으로 만들어주고, JSON을 객체로 변환할 때는 JSON에 들어있는 정보를 객체로 만들어준다.
@Data
@AllArgsConstructor
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) //SnakeCase로 변환
public class UserInfo{
private String userName,phoneNumber, email;
private Boolean isKorean;
public String getUserName() {
return userName;
}
public String getPhoneNumber() {
return phoneNumber;
}
public String getEmail() {
return email;
}
public Boolean getIsKorean() {
return isKorean;
}
}
var user= new UserInfo();
user.setUserName("Gildong");
user.setEmail("hong@gmail.com");
user.setPhoneNumber("010-9876-5432");
user.setIsKorean(true);
//스프링에서 관리하는 bean들 중 자동으로
//매핑되는 ObjectMapper들을 가져오는 어노테이션
@Autowired
private ObjectMapper objectMapper;
String json = objectMapper.writeValueAsString(user);
역직렬화: Json 형태=> 객체
var dto=objectMapper.readValue(json, UserInfo.class);
System.out.println(dto);
getter 메서드를 모두 지우고 생성자 함수를 사용해서 객체를 만들면 오브젝트 매퍼는 아무것도 받지 못한다.
그 이유는 오브젝트 매퍼는 변수에 매칭되는 것이 아닌 get으로 시작되는 메소드에 매칭되는 것이기 때문이다.
오브젝트 매핑은 직렬화를 해줄 때 변수에 따라 직렬화를 하는 것 이 아닌 get~메서드를 따라 직렬화를 한다.
또한 매핑 시 get이후의 글자를 사용한다. 예를들어 getIsKorean = true이라면 매핑된 정보는 "isKorean": true 이다.
객체의 특정 변수를 직렬화하고 싶지 않다면 @JsonIgnore 어노테이션을 사용하면 된다. 아래와 같다.
@JsonIgnore //원하지 않는 정보를 오브젝트 매핑 할 때 Json ignore을 붙이면 무시한다.
public String getUserName() {
return userName;
}