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

2023. 8. 7. 12:00공부/Spring

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