JavaScript의 Date랑 Java의 Date는 은근 친하다. 대~충 만들어서 서로 넘겨도 서로 예쁘게 잘 전달된다.
(사실 굉장히 많은 이야기가 생략되었지만);
근데 JavaScript랑 Java의 타임존이 서로 다를 때 쪼끔 문제가 된다. 한 번 보자.
// javascript
const date = new Date('2020-01-01 00:00:00'); // GMT+0900 (한국 표준시)
const params = new URLSearchParams();
params.append('date', date);
const result = await axios.post(url, params);
// java
// TimeZone.setDefault(TimeZone.getTimeZone("America/Bogota"))
public Date date(Date date) {
return date; // "Tue Dec 31 10:00:00 COT 2019"
}
만약 서버에서 할 일이 클라이언트 시각 기준이라고 하면 별 문제가 되지 않는다.
타임존이 다를 뿐, 서로 같은 시각이니까..
그러니까 클라이언트의 의도가 중요하다.
서버에서 할 일이 서버 시각 기준이라면, 그리고 클라이언트도 그렇게 알고 있다면,
서버에서 "Tue Dec 31 10:00:00 COT 2019"
이렇게 받는게 아니고
"Wed Jan 01 00:00:00 COT 2020"
이렇게 받았어야 한다.
즉 클라이언트에서 타임존 정보를 제외하고 보내야 한다.
요걸 알기 전에 먼저, JavaScript Date의 toString()을 믿어야 하나 요 글을 한 번 보자.
그렇다.. 믿을 놈이 아닌 것이다.
T_T
const date = new moment('2020-01-01 00:00:00').format('LLL'); // January 1, 2020 12:00 AM
Date.prototype.getDate() 등으로 Locale aware formats를 직접 구현하기
클라이언트와 서버 사이에 서로 적당~히 미리 포멧 정해두기
→ 보통 이 방법이 제일 많이 쓰이죠. 사실상 표... 준?;
반대로 서버에서 클라이언트로 데이터를 주는 경우도 있다. 마찬가지의 문제가 발생하고, 마찬가지의 맥락으로 Locale aware formats를 할 수 있다.
spring.jackson.date-format: yyyy-MM-dd HH:mm:ss
jackson 말고 다른 serializer도 비슷한 맥락으로 진행하면 될 듯