최근에 Flutter로 구현한 클라이언트 앱을 테스트하던 중 예상치 못한 문제가 발견되었다.
분명 서버로부터 시간도 정상적으로 받아오는데 DateTime.now()를 통해 현재시간과 비교를 해봐도
9시간이 넘어가는 시간으로 표시가 되던 것이다.
짐작컨대 이것도 골치 아픈 UTC시간대 이슈일 것으로 생각되었고
실제 Raw 데이터를 확인했을 때 시간이 이렇게 표시가 되던 것이다.
왼쪽: DateTime.now() 오른쪽: DateTime.parse(data['postedDateTime']);
시간 숫자 자체는 DB에 저장된 시간이랑 동일하다
문제는 저 뒤에 Z자 하나 때문에 Flutter에서는 이것을 UTC 시간으로 인지를 해버리는 탓에
실제로 toLocal() 함수를 돌렸을 때 +9 시가 된 18시로 표시가 되던 것이다.
PostMan으로 확인했을 때도 결과는 다음같이 나왔다.
{
"postedDateTime":"2022-04-05 11:18:48:000Z"
}
저 Z자 만 어떻게 없애면 되는데
확인을 해보니 NodeJs에서 db옵션의 TimeZone을 적용해주고 dateStrings를 true로 두면 된다고 한다.
그래서 내 db옵션을 이렇게 변경했다.
{
"host":"172.27.0.1",
"user":"dbuser",
"password":"123123",
"port":"3306",
"database":"testdb",
"connectionLimit": 5,
"timezone":"Asia/Seoul",
"dateStrings":true
}
"timezone" : "Asia/Seoul",
"dateStrings":true
를 추가해주었다.
PostMan으로 호출한 결과 아래의 값처럼 깔끔하게 출력이 된 모습이다.
{
"postedDateTime":"2022-04-05 11:18:48"
}
Flutter에서도 테스트를 해보니 정상적으로 한국 시간대로 인지를 하게 되는 모습을 보였다.
dateString의 경우 mysql의 날짜 표시 형식을 string형으로 표시를 하겠다는 속성 값이다.
해당 값이 false일 때는 DateTime을 그대로 표현하기 때문에 DB의 존재하는 DateTime의 정보를 알맞게 가져오기 위해서는 true로 두어야 한다.
'⚙️ Node.js' 카테고리의 다른 글
[Node.js] path 모듈에 대해 알아보자 (0) | 2023.02.20 |
---|---|
[Node.js] Callback 패턴을 async/await 패턴으로 바꾸기 (0) | 2023.02.17 |
[Node.js] crypto 암호화 구현 시 Invalid key length 오류 (0) | 2022.08.17 |
[Node.js] MySql Connection Pool 작동 방식 및 구현 (0) | 2022.07.06 |
[Node.js] MySql PROTOCOL_CONNECTION_LOST 해결 (0) | 2022.07.01 |