ObjectMapper 커스텀

shlee ⚡️·2023년 11월 25일
0

SpringBoot-fc3-project

목록 보기
1/1

기본적으로 ObjectMapper가 동작하여
json을 object로 만들어 주는 역직렬화
object를 내보낼 때 json으로 만들어주는 직렬화에 대해서 깊게 알아보자.

날짜라던지 또는 java8 이후에 나온 것들을 처리하다 보면 에러가 난다던지
특정 회사와 통신할 때는 카멜케이스인데 우리는 스네이크 케이스를 쓰고 있다던지..
여러 상황이 나올 수 있다

기본적으로 ObjectMapper는 카멜케이스를 사용
강사는 스네이크 케이스를 선호
보통 ObjectMapper 커스텀해서 많이 사용함

ObjectMapper 커스텀

AccountMeResponse

@Data
@Builder
public class AccountMeResponse {
    private String email;
    private String name;
    private LocalDateTime registeredAt;
}

AccountApiController

@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();
    }
}

  • 참고 - 해당 시간의 양식은 국제표준 양식 ISO 8601 스펙
  • default설정으로 카멜케이스 registeredAt으로 들어가 있음

AccountMeResponse - 추가

  • @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
@Data
@Builder
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public class AccountMeResponse {
    private String email;
    private String name;
    private LocalDateTime registeredAt;
}

스네이크 케이스로 변경 되었다
하지만 이러한 @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)를 얼마나 많이 써야할까?
그래서 공통화 처리를 하는게 좋다 (ObjectMapper 커스텀)

ObjectMapperConfig

@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;
    }
}

AccountMeResponse - 수정

  • @JsonNaming 제거
@Data
@Builder
//@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) <- 제거
public class AccountMeResponse {
    private String email;
    private String name;
    private LocalDateTime registeredAt;
}

테스트

  • 성공
  • ObjectMapper 커스텀 완료

추가

  • 기본적으로 타임스탭프로 직렬화 되므로 disable해주는 것
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
  • 타임스탬프로 직렬화시 아래 이미지와 같이 나옴
profile
흔들리지 말고.. 묵묵히

0개의 댓글

관련 채용 정보