Programming/Springboot

[Springboot] @DateTimeFormat @JsonFormat

bisi 2022. 10. 31. 09:24

 

이번 글에서는 @DateTimeFormat과  @JsonFormat 의 차이에대해서 알아보겠습니다. 

 

@DateTimeFormat는 Spring에서 제공하는 어노테이션이구요,

@JsonFormat 은 Jackson에 제공하는 어노테이션인데요,

 

테스트를 위해서 @Test 어노테이션을 선언한 함수를 생성해주고요.

@Test
    public void localdate_test() throws Exception {
//        String content = objectMapper.writeValueAsString(new RequestSetterDto("jojoldu", 1000L,  LocalDate.of(2019,2,22), RequestSetterDto.RequestType.GET));
        String content = objectMapper.writeValueAsString(new RequestTestDto("log", (long) 1000,  LocalDate.of(2020,6,19)));
        MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
        params.put("name", Arrays.asList("log"));
        params.put("money", Arrays.asList("1000"));
        params.put("date", Arrays.asList("2020-06-19"));
        // conten
        mvc
                .perform(MockMvcRequestBuilders.get("/request/setter")
                        .params(params)
                        .contentType(MediaType.APPLICATION_JSON))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.content().contentType(MediaType.APPLICATION_JSON))
                .andExpect(MockMvcResultMatchers.content().json(content));
    }

 

 

RequestTestDto 클래스에서 로그를 찍어 확인해봅니다. 

 public class RequestTestDto {
    private static final Logger LOGGER =  LoggerFactory.getLogger(RequestTestDto.class);
    private String name;
    private Long money;

    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate date;

    public RequestTestDto() {
        LOGGER.info(">>>>>>>>> create RequestTestDto");
    }
    
    ........
    //getter setter tostring
	
}

 

@DateTimeFormat 사용시에는 위에서 선언한 name, amount, date가 정상적으로 출력된 것을 로그로 확인할 수 있습니다.

 

 

동일한 로직을 @JsonFormat으로 사용해서 호출 시켜보았는데요. 

public class RequestTestDto {
    private static final Logger LOGGER =  LoggerFactory.getLogger(RequestTestDto.class);
    private String name;
    private Long money;

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul")
    private LocalDate date;

    public RequestTestDto() {
        LOGGER.info(">>>>>>>>> create RequestTestDto");
    }
    ...........
}

 

직렬화 실패로 출력되었습니다.

 

결론은 날짜를 직렬화 할경우엔 @DateTimeFormat을 사용하시길 추천드려요.