팀프로젝트로 웹 사이트 개발 과정에서 게시글이나 댓글이 등록 또는 수정된 시간을 데이터베이스에 기록하는 과정에서 신기한 부분을 발견했다.
1. 들어갈 때랑 나올 때 시간 형식이 변한다.
@app.route("/members/<int:member_id>/comments", methods=["POST"])
def post_comments_with_id(member_id):
now = datetime.now() # 한국 기준 현재시각을 출력합니다.
data["upload_time"] = now
db.comments.insert_one(data)
return jsonify({"msg": "방명록 작성 완료!"})
방명록 POST 과정에서 다른 과정은 생략하고 현재 시각 설정에 관한 코드만 보자
일상에서 현재 시각이 필요한 경우 항상 datetime의 now 메소드를 사용했었다.
이는 PC에서 설정된 현재 시각을 알려주는 기능을 갖고 있다.
이를 mongoDB 데이터베이스에 담아 입력하면 Atlas에서 2023-05-23T11:20:24.689+00:00
로 입력되는 것을 확인할 수 있었다.
하지만 신기한 점은 데이터베이스에서 꺼낼 때였다.
방명록이 작성된 시각을 요청하여 리스폰 받으면 Thu, 23 May 2023 11:20:24 GMT
과 같은 형식으로 변경되어 들어온다는 점이었다.
어차피 ms시간을 제외한 후 프론트에 전달할 예정이었기 때문에 시간 데이터에 대한 문자열 포매팅이 필요한 상황이었지만 이건 너무 많이 변한게 아닌가??
어쨌든 자바스크립트 코드로 포매팅하는 방법을 찾아서 아래와 같이 함수를 적용했다.
function dateFormatter(dateString) {
const inputDate = new Date(dateString);
const year = inputDate.getFullYear();
const month = String(inputDate.getMonth() + 1).padStart(2, "0");
const day = String(inputDate.getDate()).padStart(2, "0");
const hours = String(inputDate.getHours()).padStart(2, "0");
const minutes = String(inputDate.getMinutes()).padStart(2, "0");
const seconds = String(inputDate.getSeconds()).padStart(2, "0");
const outputDateString = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
return outputDateString
};
데이터베이스에서 받아온 문자열 시간 데이터를 함수에 적용하면 new Date 객체 생성을 통해 문자열 데이터에서 필요한 시간을 추출할 수 있게 된다.
하지만 이상하게도 new Date로 생성한 시각이 2023-05-23 20:20:24
로 9시간이 더해진 상태로 출력되는 것을 확인할 수 있었습니다. 이는 UTC(협정 세계시)와 KST(한국 표준시)에 9시간 차이가 있다는 점과 연관이 된 것으로 확인했다. 그런데 재밌는 점은 KST는 UTC보다 9시간 빠르다는 점, 그러니까 UTC에 +9시간을 한 시각이 KST라는 점이다.
그런데 데이터베이스에 들어간 시간은 KST 기준 시각으로 잘 입력이 되었는데 자바스크립트의 new Date에 들어가는 순간 또 9시간이 더해진 셈이다.
아무래도 new Date를 생성하는 순간 KST 기준으로 시각을 자동 변경한 것으로 보여진다. 이를 예방하기 위해서는 애시당초 mongoDB에 UCT 기준으로 시간데이터를 담도록 해야할 것 같다.
하지만 팀프로젝트는 미니프로젝트로 한국 이외에 사용할 계획이 없으며 Atlas에서 확인할 때도 UCT가 아닌 KST가 찍혔으면 하여 아래와 같이 백엔드 단에서 KST 시간을 규정하고 데이터베이스에 넘기는 방법을 채택하였다.
from datetime import datetime, timezone, timedelta
@app.route("/members/<int:member_id>/comments", methods=["POST"])
def post_comments_with_id(member_id):
kst = timezone(timedelta(hours=9))
now = datetime.now(tz=kst) # 한국 기준 현재시각을 출력합니다.
data["upload_time"] = now
db.comments.insert_one(data)
return jsonify({"msg": "방명록 작성 완료!"})
이렇게하여 new Date 생성 시에도 사전에 KST로 데이터베이스에 입력된 기록이 있어서인지는 몰라도 데이터베이스에 기록된 시간 그대로 프론트에 출력할 수 있었다.
'백엔드 개발자(node.js)가 되는 과정' 카테고리의 다른 글
자바스크립트에서의 클래스 구현과 클로저 (0) | 2023.05.25 |
---|---|
npm global 설치와 환경 변수 (0) | 2023.05.24 |
파이썬 vs 자바스크립트 코드의 차이 (1) | 2023.05.23 |
AWS EC2에서 mongoDB 데이터베이스 생성하기 (0) | 2023.05.19 |
백엔드 기초 입문과 미니 프로젝트 03 (0) | 2023.05.17 |