본문 바로가기
I LEARNED/TIL

TIL_JsonFormat

by veganwithbacon 2022. 8. 18.
반응형

  @JsonFormat

: JsonFortmat은 Jackson 라이브러리에서 제공하는 어노테이션으로 JSON 응답값의 형식을 지정할 때 사용한다. 응답값의 형식이란 날짜 형식 뿐만이 아니라 JSON 응답의 키 설정,특정 값의 포함 여부,응답값의 순서 등 여러가지 형태를 의미한다.

 

사용방법이 간단하여 @JsonFormat을 통해 날짜 형식을 지정하려면 다음과 같이 사용하면 된다

pattern : 원하는 날짜 형식을 지정한다

timezone : 표준시간대를 설정한다. 기본값은 UTC이다

 

위 형식으로 " yyyy-MM-dd  HH:mm:ss" 로 뽑게 되면

아래와 같이 출력된다

 

 

  @DateTimeFormat    vs    @JsonFormat

@DateTimeFormat과 @JsonFormat은 어떤 차이가 있을까?

@DateTimeFormat은 Spring의 어노테이션이고 @JsonFormat은 jackson의 어노테이션이다

@JsonFormat은 LocalDate 혹은 LocalDateTime을 JSON으로 직렬화할때 포맷을 관리한다

Spring의 기본 JSON컨버터는 Jackson이다

 

그래서 JSON으로 변환할 때 Jackson을 통해서만 진행된다

JSON 직렬화 과정에서 @JsonFormat이 없다면 Spring에서는 @DateTimeFormat을 통해 직렬화를 진행한다

반면 Jackson은 Spring의 어노테이션인 @DateTimeFormat을 전혀 알 수 없다.

(둘은 별개의 라이브러리이기 때문)

 

@DateTimeFormat을 지정했다고 한들, Jackson은 이 어노테이션을 고려하지 않고 JSON 직렬화를 진행하는 것이다

JSON 직렬화 외에는 Jackson이 사용되지 않기에 @JsonFormat은 효과가 없다

 

Get요청시 RequestParameter나 ModelAttribute에서는 @DateTimeFormat만 적용될 수 있다

일반적으로 Get요청시 LocalDateTime 파라미터가 필요할 경우 2022-08-18 09:00:00 보다 

2022-08-18T09:00:00를 선호한다고 한다. 띄어쓰기로 인해 값이 잘못 넘어올수 있어서 포맷 안에서 `T`로 써준다고 한다

 

POST요청을 하는 RequestBody 사용 시에 @DateTimeFormat과 @JasonFormat의 순서는 이렇다

 -  두 어노테이션 모두 있다면 @JsonFormat이 진행된다

 -  @JsonFormat이 틀리면 @DateTimeFormat이 맞더라도 직렬화는 실패한다

 -  단,@DateTimeFormat이 있다면 @DateTimeFormat의 포맷으로 직렬화가 진행된다 

 

Response Body로 JSON값이 리턴할 때?

서버 응답 시 ResponseBody에서는 @JsonFormat만 가능하다

 

참고 자료 :

https://addio3305.tistory.com/101

https://linked2ev.github.io/java/2020/11/06/JAVA-7.-%EC%96%B4%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-JSON-%EA%B0%9D%EC%B2%B4-Date-%ED%98%95%EC%8B%9D-%EB%B3%80%ED%99%98(@JsonFormat,-@DateTimeFormat)/

https://jojoldu.tistory.com/361

반응형

댓글