Object Mapper
- 객체 간 데이터를 변환하는 데 사용되는 도구
- 주로 객체를 직렬화(serialize)하거나 역직렬화(deserialize)할 때 사용
기본 Object Mapper
@SpringBootTest
class RestApiApplicationTests {
@Autowired
private ObjectMapper objectMapper;
@Test
void contextLoads() throws JsonProcessingException {
var user = new UserRequest();
user.setUserName("홍길동");
user.setUserAge(10);
user.setEmail("hyekjung.com");
user.setIsKorean(true);
var json = objectMapper.writeValueAsString(user);
System.out.println(json);
var dto = objectMapper.readValue(json, UserRequest.class);
System.out.println(dto);
}
}
Object Mapper의 동작 방식
write
UserRequest @Data를 없애고(getter, setter 없음) 객체 선언 및 toString만 하였음.
- 결과를 확인해보면 Json은 공란으로 출력되는 것을 확인할 수 있음.
- Object Mapper는 메서드(변수 x)에 매칭 되기 때문
UserRequest에 getter를 추가한다면 다시 Json 형태로 반환되는 것을 볼 수 있음.
- Object Mapper는 직렬화 시 'get' 이름의 메소드를 참고함.
- Json으로 사용하지 않을 때는
@JsonIgnore 어노테이션 사용
객체 선언 및 toString만
@AllArgsConstructor
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public class UserRequest {
private String userName;
private Integer userAge;
private String email;
private Boolean isKorean;
@Override
public String toString() {
return "UserRequest{" +
"userName='" + userName + '\'' +
", userAge=" + userAge +
", email='" + email + '\'' +
", isKorean=" + isKorean +
'}';
}
}
객체 선언 및 toString만 - 결과
@SpringBootTest
class RestApiApplicationTests {
@Autowired
private ObjectMapper objectMapper;
@Test
void contextLoads() throws JsonProcessingException {
var user = new UserRequest("홍길동", 10, "hyekjung.com", true);
System.out.println(user);
var json = objectMapper.writeValueAsString(user);
System.out.println(json);
getter 추가
@AllArgsConstructor
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public class UserRequest {
private String userName;
private Integer userAge;
private String email;
private Boolean isKorean;
public String getUserName() {
return userName;
}
public Integer getUserAge() {
return userAge;
}
public String getEmail() {
return email;
}
public Boolean getKorean() {
return isKorean;
}
@Override
public String toString() {
return "UserRequest{" +
"userName='" + userName + '\'' +
", userAge=" + userAge +
", email='" + email + '\'' +
", isKorean=" + isKorean +
'}';
}
}
getter 추가 - 결과
{"user_name":"홍길동","user_age":10,"email":"hyekjung.com","korean":true}
그 외
@JsonProperty
@JsonProperty("이름") 지정 시 해당 변수는 괄호 안의 이름을 사용하겠다는 뜻
@JsonProperty("user_email")
private String email;
@JsonIgnore
- Json으로 사용하지 않겠다는 뜻
- 생성한 getter 이외에도 Json으로 인식('get'이 포함되어있기 때문) 될 수 있으니 사용하지 않는다면 JsonIgnore 필수!
@JsonIgnore
public String getUser(){
return userName;
}