기본적으로 ObjectMapper가 동작하여
json을 object로 만들어 주는 역직렬화
object를 내보낼 때 json으로 만들어주는 직렬화에 대해서 깊게 알아보자.
날짜라던지 또는 java8 이후에 나온 것들을 처리하다 보면 에러가 난다던지
특정 회사와 통신할 때는 카멜케이스인데 우리는 스네이크 케이스를 쓰고 있다던지..
여러 상황이 나올 수 있다
기본적으로 ObjectMapper는 카멜케이스를 사용
강사는 스네이크 케이스를 선호
보통 ObjectMapper 커스텀해서 많이 사용함
@Data
@Builder
public class AccountMeResponse {
private String email;
private String name;
private LocalDateTime registeredAt;
}
@RestController
@RequestMapping("/api/account")
@RequiredArgsConstructor
public class AccountApiController {
private final AccountRepository accountRepository;
@GetMapping("/me")
public AccountMeResponse me(){
return AccountMeResponse.builder()
.name("Lee1")
.email("aaa@naver.com")
.registeredAt(LocalDateTime.now())
.build();
}
}
@Data
@Builder
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public class AccountMeResponse {
private String email;
private String name;
private LocalDateTime registeredAt;
}
스네이크 케이스로 변경 되었다
하지만 이러한 @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
를 얼마나 많이 써야할까?
그래서 공통화 처리를 하는게 좋다 (ObjectMapper 커스텀)
@Configuration
public class ObjectMapperConfig {
@Bean
public ObjectMapper objectMapper(){
var objectMapper = new ObjectMapper();
objectMapper.registerModule(new Jdk8Module());
// 8버전 이후에 나온 클래스들을 처리 해주기 위해서 (Optional같은) 모듈 등록
objectMapper.registerModule(new JavaTimeModule());
// local date같은 애들 처리 모듈 등록
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// 모르는 json field가 들어오더라도 익셉션 무시하고 객체에 파싱
objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
// 비어있는 객체 json으로 직렬화시 익셉션 무시 그냥 비어있는 json 객체 만듦
// 날짜 관련 타임스탬프 직렬화 disable -> ISO-8601 형태로 포맷되어 나온다
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
// 스네이크 케이스 디폴트
objectMapper.setPropertyNamingStrategy(new PropertyNamingStrategies.SnakeCaseStrategy());
return objectMapper;
}
}
@Data
@Builder
//@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) <- 제거
public class AccountMeResponse {
private String email;
private String name;
private LocalDateTime registeredAt;
}
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);