(최종 프로젝트 진행중)
내일 할 일
- 시간 차 트러블슈팅 정리하기
※ 이하는 스스로 공부하며 적어둔 노트이며 불확실한 내용이 있을 수 있습니다. 학습용으로 적합하지 않음을 유념해주세요. ※
시간 차 트러블슈팅중…
UTC 적용전…
현재 사용하는 Timezone 정리:
분류 | 타임존 | 비고 | |
AWS RDS DBMS | UTC | ||
TypeORM | Z = UTC | TypeORM에게 너가 연결할 DBMS는 UTC로 되어있다! 라고 알려주는 거죠. | 옵션에 timezone=’Z’라고 추가함 |
서버컴퓨터(Heroku) | UTC | 아! 이 컴퓨터의 ‘로컬 타임’이 KST나 en-US 등이 아니고, UTC로 되어 있다는 뜻이었다..! 여기서 프론트에서 “Asia/Seoul”로 바꿔서 출력해주는 게 맞는 것이었다. | |
개발컴퓨터 | KST | 무시하자 = “Asia/Seoul”로 설정 |
- 우선 OS 레벨의 타임존 설정은 사용하지 않기로 했어요. 왜냐하면 OS 레벨 타임존을 따를 경우, 개발할 때는 되다가 배포하면 안되는 상황이 생길 수 있기 때문입니다. (일명
제꺼에서는 되는데요..!?
현상) → 어떻게?
export const typeormConfig: TypeOrmModuleOptions = {
...
timezone: 'UTC', // Z, UTC, KST, Asia/Seoul 등 입력 가능
...
};
(참고: https://techblog.wclub.co.kr/posts/0007.what-is-timezone/Timezone 맞춰주는 법 총정리)
(참고: heroku 타임존 디폴트 설정은 UTC다 : https://help.heroku.com/JZKJJ4NC/how-do-i-set-the-timezone-on-my-dyno)
(참고: 아마존 RDS 타임존 디폴트 설정도 UTC다: https://repost.aws/knowledge-center/rds-change-time-zone)
mysql 기본 timezone을 utc로 설정해보았다 (DBeaver로)
이전:
이후 (별 소용이 없다):
⇒ DB는 처음부터 UTC로 설정되어 있었고, 잘 들어가고 있었다.
이유는 모르겠지만 됐다. 아침에 찾아본 시간을 제외하고도 저녁 시간만 장장 5시간을 거쳐…
원인1: timezone: 'Z',
원인2: dbeaver 시간 세팅을 바꿈 (이건 불확실)
원인3: const created_at = post.created_at.toLocaleString('ko-KR', { timeZone: 'Asia/Seoul' }); %>
⇒ 1과 3이 유력하다고 봄. 필요한 프론트마다 3을 적용시키면 되겠다.
필요한 곳: 댓글 날짜, 품앗이 begin과 end date.
⇒ 품앗이 게시글이 따로 놀았던 (잘 됐던) 이유도 알겠다. toLocaleString()을 거치지 않고 순수 초 단위로 계산해서 …
내일:
이거를 timezone:Z라고 해놓기 전과 후 ‘자유게시판 날짜 포맷’ 비교해보고,
그래서 그 이후로 진짜 힌트가 된 ‘어, 배표 환경은 서버 로컬 시간으로 포맷이 이루어진 것 같다!’는 차이점이 ‘생겨나서’ 발견하게 된 건지, 원래 있었는데 못봤던 건지 확인해보기.
더불어 아침에도 원인3을 적용해봤던 것 같은데 원인 1없이 해서 제대로 작동하지 않았던 게 맞는지도 확인해보기
⇒ 원인1만 리셋해놓고 전후 비교, 원인 3만 리셋해놓고 전후 비교, 이렇게 해보기.
그러니까, 서버 자체의 timezone은 UTC로 되어 있는데, 이게 toLocaleString()에서 먹는 옵션1번의 ‘로컬’은 또 미국이라고 인지를 하고 있었다. 그래서 년/월/일 시:분:초 PM 이런 식으로 출력이 됐고. toLocaleString()의 옵션1이 이렇게 인지하고 있다면 옵션 2도 똑같이 미국으로 인지하고 있지 않을까 해서 …저처럼 해봤더니 됐던 것이다. 하나 의문은, ‘로컬’을 es-us로 인식하고 있던 거라면, 왜 시간대 timeZone을 pst 등으로 나타내지 않고 uct 그대로 나타내었는가 하는 점이다. 옵션1이 인식하는 ‘로컬’과 , 옵션 2가 인식하는 ‘로컬시간’이 달라야만 이게 말이 된다.
(참고로 date-fns는 알아봤으나 이 문제를 해결하는 함수를 제공하지 않는 것 같아 스킵하였다)
(date-fns 메소드 소개글 - https://jsikim1.tistory.com/197)
참고로, 브라우저 타임존을 알아내는 코드:
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone);
=> Asia/Seoul 01:48:05.297
(참고: NHN의 프론트엔드 타임존에 대한 좋은 PPT - https://rlxuc0ppd.toastcdn.net/presentation/[NHN FORWARD 2020]프런트엔드 타임존 뽀개기.pdf)
Uploaded by N2T