@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만 가능하다
참고 자료 :
'I LEARNED > TIL' 카테고리의 다른 글
[TIL] [troubleshooting] for input string"name" (0) | 2022.08.20 |
---|---|
[TIL] [spring/ troubleshooting] org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL (0) | 2022.08.20 |
TIL_(생활코딩)객체 지향 프로그래밍 (0) | 2022.08.15 |
WIL_2 CORS (0) | 2022.08.15 |
TIL_연관관계 주인 정하기 (0) | 2022.08.15 |
댓글