티스토리 뷰
mysql을 nodejs에서 사용할때는 가장 유명한패키지 2개가 있습니다
https://www.npmjs.com/package/mysql2
https://www.npmjs.com/package/mysql2
두개 모두 위클리 다운로드가 100만이상인 패키지 입니다
mysql에서 date를 나타내는 타입에는
- date
- datetime
- timestamp
이렇게 3개가 있습니다
datetime과 timestamp는 시분초까지 나타내는 타입이고
date는 년월일 까지만 나타내는 타입입니다
datetime과 timestamp는 생성시각, 업데이트시각, 특정작업이 수행된 시각등을 넣는용도로 많이 사용되고
date 타입은 말그대로 어떤 날짜(년월일형태의)를 저장하려는 목적으로 사용됩니다
예로들면 생년월일이나, 시분초가 필요없는 날짜가 저장될때말이죠
그래서 datetime이나 timestamp는 order by나 between 같은 연산을 사용하는 경우가 많고
date는 단순 표시용이라던가 where의 단순 equal 조건으로서 사용되는 경우가 많은 것 같습니다
mysql, mysql2 모두
date, datetime, timestamp 컬럼의 값을 조회하는 경우
해당 컬럼의 값을 javascript의 date 오브젝트로 생성하여 리턴합니다
누가봐도 매우 합리적인 조치입니다
코드 내부를 살펴보면 위에 언급한 두개의 패키지 모두 date 타입을 다룰때 아래와 같은 방법으로 다루고 있습니다
// mysql2
let str = this.readDateTimeString(6, 'T');
if (str.length === 10) {
str += 'T00:00:00';
}
return new Date(str + timezone);
// mysqljs
var originalString = dateString;
if (field.type === Types.DATE) {
dateString += ' 00:00:00';
}
if (timeZone !== 'local') {
dateString += ' ' + timeZone;
}
var dt = new Date(dateString);
두 방법이 유사하게 컬럼이 date 타입인경우 T00:00:00 이라는 string을 덧붙인 후에
timezone에 해당 하는 string을 또한번 덧붙입니다
그러니깐 여러분의 mysql 의 date type을 가진 컬럼이 있는 경우
해당 컬럼의 값이 2020-05-01 이라면
2020-05-01T00:00:00+09:00
이렇게 최종적으로 iso8601 형태의 string으로 완성되고 이 값이 new Date를 생성하는 매개변수로서 사용되는것입니다
자 이런 상황을 한번 가정해봅시다
여러분의 데이터 베이스는 kst를 기준으로 값이 저장되어있습니다
그리고 컬럼중에 birthday를 저장하는 date 타입의 컬럼이 있습니다
1990-01-01
이렇게 값이 입력되었을때 이사람의 생일은 말그대로 1990년 1월 1일생입니다
iso8601 형태로는
1990-01-01T00:00:00+09:00 이죠
UTC로는
1989-12-31T15:00:00+00:00 입니다
KST와 UTC를 볼때 두개가 같은 날짜와 시각을 가리키고 있지만 출력되는 년월일 표시가 전부 달라져버렸습니다
그래서 간혹 utc인것을 이해하지 못하고 코드상으로 년월일을 잘못계산하는 계산실수가 발생할수 있는 가능성이 있습니다
이 방법을 방지할수 있는 방법으로는 date컬럼을 date 타입으로 다루지 말고 string으로 다루는 방법이 있습니다
mysql connection을 생성할때 dateStrings 옵션을 활용할수 있습니다
var connection = mysql.createConnection({
...
dateStrings: ['DATE']
});
참고로 대문자로 입력하셔야 합니다 (TIMESTAMP, DATETIME, DATE)
dateStrings 옵션이 있습니다
이 옵션은 boolean 또는 string형태로 사용하려는 타입이름을 가진 배열을 값으로 갖습니다 (boolean | string[])
기본값은 false이구요
이 값을 true로 설정하거나 또는 배열로 DATE 타입만 string으로 변경하려는 경우 ['DATE'] 이렇게 값을 지정하면
DATE에 해당하는 타입을 가진 컬럼의 값은 javascript의 date 타입이 아닌 string 타입으로 반환된답니다
'BACKEND' 카테고리의 다른 글
당신의 REST API는 멱등한가요? (0) | 2023.07.06 |
---|---|
phpMyAdmin말고 adminer도 있네 (0) | 2023.06.22 |
openapi 3.1에서 3.0과 달라지는 점 (0) | 2023.05.04 |
aws에서 nodejs 16버전을 쓰고 싶으시다구요? (0) | 2023.04.21 |
mongoose, nestjs에서 discriminator 사용해보기 (1) | 2023.04.20 |
- Total
- Today
- Yesterday
- 게임
- php
- Apple
- 아이폰
- 대학생
- 애플
- 웹표준
- 벤처
- 트위터
- 공모전
- 어플리케이션
- 구글
- android
- 창업
- 경진대회
- 안드로이드
- 앱스토어
- AWS
- 모바일
- iPhone
- CSS
- JavaScript
- 스마트폰
- 자바스크립트
- 아이디어
- 네이버
- 소프트웨어
- 앱
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |