일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- CCPC
- BOJ Social Distancing
- 모바일 버전만들기
- 백준 BOJ
- social distancing
- 백준 Social Distancing II
- 텐서플로맛
- BOJ
- BOJ Social Distancing II
- 18881번
- Spring Security
- 베리어블 폰트
- VUE
- java
- 일해라 개발자
- 백준
- vue.js
- CSS
- 18877번 Social Distancing
- Catholic univ Computer Programming Contest
- JavaScript
- 18877번
- async
- await
- spring boot
- BOJ 18881
- BOJ 18877
- Social Distancing II
- 반응형 웹
- 백준 18877번
- Today
- Total
나아가는 길에 발자국을 찍어보자
[Spring boot] 날짜 타입 JSON 변환 본문
크게 신경 쓰고 있지않았던 날짜관련 클래스와 어노테이션이 생각보다 오류를 처리하는데 발목을 잡아서
어노테이션까지 정리를 해보도록 해야겠다. 생각보다 이런부분에서 구멍이 있다면 참 많은 시간을 잡아 먹는구나를 알게 되었다. 열심히 공부해야지!
정리할 내용 : REST API에서 사용하는 날짜 포맷
- 직렬화를 하지 못하면 오류가 발생한다.
- String으로 받지말기.....
1. @DateTimeFormat
- Spring에서 지원하는 어노테이션으로 LocalData / LocalDateTime과 같은 날짜 관련타입의 직렬화를 지원하는 어노테이션이다.
- GET 요청시 Request Body에서 사용.(RequestParmeter에서도 사용한다)
- POST 요청시 Request Body에서도 사용.
<조건>
- 두 어노테이션 모두가 있으면 @JsonFormat이 진행된다
- @JsonFormat이 틀리면 @DateTimeFormat이 맞더라도 직렬화는 실패한다
- 단, @DateTimeFormat이 있다면 @DateTimeFormat의 포맷으로 직렬화가 진행된다.
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
private LocalDateTime startDay;
@GetMapping("/request")
public String requestMethod(
@DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
@RequestParam("requestdatetime") LocalDateTime requestdatetime) {
})
- 패턴사용시
@DateTimeFormat(pattern="yyyyMMddHHmmss")
2. @JasonFormat
- Jackson의 어노테이션(JSON을 변환 할때 사용)
- LocalDate / LocalDateTime을 JSON으로 직렬화 할때 포맷을 관리한다.
- Post요청시 RequestBody와 ReponseBody에서 사용.
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime startDay;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul")
private LocalDate birthDay;
** POST로 보내는 Request Body(Json 객체)는 @DateTimeFormat과 @JsonFormat 모두 사용할 수 있다.
** ResponseBody에서는 @JsonFormat만 가능하다.
3. 이유
JSON으로 변환을 할때 Jackson을 통해서 진행되는데,
Jackson은 Spring의 어노테이션인 @DateTimeFormat 을 알수 없기 때문에(서로 다른 라이브러리) @DateTimeFormat을 지정했다 하더라도, Jackson은 이 어노테이션을 전혀 고려하지 않고 JSON 직렬화을 진행하게된다. -> 에러 발생.
따라서 Response로 JSON으로 변환해 직렬화 시킬땐 @JsonFormat을 사용해야한다.
( JSON 직렬화 과정에서 @JsonFormat이 없다면 Spring에서는 @DateTimeFormat를 통해 직렬화를 진행하기때문에 post요청에서는 두 어노테이션이 모두 사용가능한것이다.)
반대로, JSON직렬화 외에는 jackson이 사용되지않기때문에 @JsonFormat은 효과가 없다.
따라서 RequestParameter나 ModelAttribute에선 @DateTimeFormat 만 적용될 수 있는 것이다.
4. 정리
- Response (서버 -> 클라이언트) 로 전달할 때에는 @JsonFormat 을 사용,
- Request(클라이언트 -> 서버)로 전달할 때는 @DateTimeFormat 을 사용한다.
(post요청시 request에서는 @jsonFormat 사용 가능) - Post 요청시에도 @DateTimeFormat이 적용될 수 있으나, @JsonFormat이 지정되어 있지않을 때만 가능하다.
- JsonFormat을 사용했을때 직렬화에 실패한다면 DateTimeFormat을 사용하자
- Spring Boot 2.0에서는 JSR 310이 기본 의존성에 포함되어있다.(이것은 잘모름...)
<참고 블로그>
https://jojoldu.tistory.com/361
'Spring && Spring boot' 카테고리의 다른 글
[ Spring Security ] 비밀번호 암호화 PasswordEncoder (1) | 2020.11.18 |
---|---|
[Java] 날짜 타입 클래스(LocalDate, LocalTime, LocalDateTime) (0) | 2020.09.23 |
expected at least 1 bean which qualifies as autowire candidate. Dependency annotations:{} 에러 (0) | 2020.08.21 |
expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {} 에러 (0) | 2020.08.21 |
Lombok 라이브러리 (0) | 2020.07.27 |