본문 바로가기
공부/Spring

[Spring] LocalDate, LocalDateTime의 serializer와 deserializer 커스텀하기 (Json과 LocalDate 혹은 LocalDateTime 변환)

by 웅대 2023. 8. 7.
728x90
반응형

프로젝트를 진행하는 도중 클라이언트로부터 날짜를 받아서 저장할 일이 있었다.

 

그래서 해당 날짜 필드를 사용하는 엔티티에서 날짜 필드의 타입을 LocalDate로 정해두었다.

 

이런식으로 클라이언트와 날짜를 주고 받을 때는 LocalDate, 날짜 + 시간을 주고 받을 때는 LocalDateTime을 사용한다.

 

그런데 클라이언트로부터 요청을 받을 때 JSON 형식으로 받고 응답을 내려줄 때도 JSON 형식으로 준다면 JSON 형식과 LocalDate 혹은 LocalDateTime 형식 간의 직렬화와 역직렬화를 구성해야 한다.

 

컨트롤러 및 객체 생성

우선 요청, 응답에 사용할 객체를 임시로 생성한다.

 

<ObjectEx>

@Data
@AllArgsConstructor
public class ObjectEx {
    private Date date;
    private LocalDate localDate;
    private LocalDateTime localDateTime;
}

그리고 이를 사용할 컨트롤러를 지정한다. 단순 값만 확인해 볼 예정이므로 @RestController 어노테이션을 사용하였다.

<

@RestController
public class CustomController {
    @GetMapping("/date")
    public ObjectEx hello(@RequestBody ObjectEx objectEx) {
        return objectEx;
    }
}

이제 ObjectEx 안의 LocalDate 타입과 JSON 사이의 직렬화, 역직렬화를 설정한다.

 

직렬화, 역직렬화 패턴

LocalDate를 기준으로 한번 입력받을 때는 "yyyy.MM.dd" 형식으로 입력받아서 "yyyyMMdd" 형식으로 응답해보려고 한다.

 

즉 직렬화 패턴은 "yyyyMMdd"이고 역직렬화 패턴은 "yyyy.MM.dd"로 설정하면 된다.

 

<Config>

@Configuration
public class Config {

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {

        return builder -> {
            // LocalDate 타입 직렬화, 역직렬화 패턴
            DateTimeFormatter localDateSerializeFormatter = DateTimeFormatter.ofPattern("yyyyMMdd");
            DateTimeFormatter localDateDeserializeFormatter = DateTimeFormatter.ofPattern("yyyy.MM.dd");
            
            // 등록
            builder.serializers(new LocalDateSerializer(localDateSerializeFormatter));
            builder.deserializers(new LocalDateDeserializer(localDateDeserializeFormatter));

        };
    }
}

 

 

 

LocalDateTime도 등록해보자.

 

"yyyyMMddHHmmss.SS" 형식으로 입력받아서 "yyyy.MM.dd HH:mm:ss.SS" 형식으로 응답받도록 설정해보자.

 

<Config>

@Configuration
public class Config {

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {

        return builder -> {
            // LocalDate 타입 직렬화, 역직렬화 패턴
            DateTimeFormatter localDateSerializeFormatter = DateTimeFormatter.ofPattern("yyyyMMdd");
            DateTimeFormatter localDateDeserializeFormatter = DateTimeFormatter.ofPattern("yyyy.MM.dd");

            // LocalDateTime 타입 직렬화, 역직렬화 패턴
            DateTimeFormatter localDateTimeSerializeFormatter = DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss.SS");
            DateTimeFormatter localDateTimeDeserializeFormatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss.SS");

            // 등록
            builder.serializers(new LocalDateSerializer(localDateSerializeFormatter));
            builder.deserializers(new LocalDateDeserializer(localDateDeserializeFormatter));

            builder.serializers(new LocalDateTimeSerializer(localDateTimeSerializeFormatter));
            builder.deserializers(new LocalDateTimeDeserializer(localDateTimeDeserializeFormatter));

        };
    }
}

 

 

728x90
반응형

댓글