끄적끄적

[JAVA] JavaTimeModule 포멧팅 본문

Back-end/Java

[JAVA] JavaTimeModule 포멧팅

mashko 2021. 11. 12. 18:07
반응형

https://fe-churi.tistory.com/51
기존 포스팅글에서 이넘에 대한 삽질을 했고 날짜 형식에서 문제가 생겨 JavaTimeModule을 추가했었다.
이어서 추가적으로 타임 포멧팅을 해줄 필요가 생겼다. 패턴을 "yyyy-MM-dd HH:mm:ss"패턴으로 리스폰스시에 변경해줄 필요가 생긴것이다.
방법은 간단하다.

JavaTimeModule javaTimeModule = new JavaTimeModule();

LocalDateTimeSerializer localDateTimeSerializer = new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.of("Asia/Seoul")));

javaTimeModule.addSerializer(LocalDateTime.class, localDateTimeSerializer);

objectMapper.registerModules(javaTimeModule);

JavaTimeModule와 LocalDateTimeSerializer 내부를 들여다 보니 포멧팅을 할 수 있었다.
그래서 DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.of("Asia/Seoul")를 넘겨주고
모듈에 등록해보니

변환되어 나오는 것이다.
변경한 로직 결과

@Configuration
public class JacksonConfiguration {

    @Bean
    @Primary
    public ObjectMapper enumTypeSerializing() {
        ObjectMapper objectMapper = new ObjectMapper();

        SimpleModule module = new SimpleModule();

        JavaTimeModule javaTimeModule = new JavaTimeModule();

        module.setDeserializerModifier(new BeanDeserializerModifier() {
            @Override
            public JsonDeserializer<BaseEnum> modifyEnumDeserializer(DeserializationConfig config,
                                                                 final JavaType type,
                                                                 BeanDescription beanDesc,
                                                                 final JsonDeserializer<?> deserializer) {
                return new JsonDeserializer<BaseEnum>() {
                    @Override
                    public BaseEnum deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
                        Class<? extends BaseEnum> rawClass = (Class<? extends BaseEnum>) type.getRawClass();

                        return BaseEnum.getEnum(rawClass, jp.getValueAsString());
                    }
                };
            }
        });

        module.addSerializer(BaseEnum.class, new StdSerializer<BaseEnum>(BaseEnum.class) {
            @Override
            public void serialize(BaseEnum value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
                jgen.writeStartObject();
                jgen.writeStringField("code", String.valueOf(value.getCode()));
                jgen.writeStringField("name", value.getName());
                jgen.writeStringField("desc", value.getDesc());
                jgen.writeEndObject();
            }
        });

        LocalDateTimeSerializer localDateTimeSerializer = new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.of("Asia/Seoul")));
        javaTimeModule.addSerializer(LocalDateTime.class, localDateTimeSerializer);

        objectMapper.registerModules(javaTimeModule, module);
        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

        return objectMapper;
    }
}

변경 후에
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")을 일일히 붙여둔 로직들을 전부 제거.
나중에 포멧팅형식이 따로 필요한 애들은 따로 포멧어노테이션을 써서 확인해본결과

updatedAt만 @JsonFormat(pattern = "yyyy-MM-dd")로 변경해보았다.

반응형
Comments