문제 : NodeJS로 구성된 API서버에서 입력한 시간을 MSSQL 서버에 입력 시 간혹 1 밀리세컨드 차이가 발생함.
원인 : NodeJS에서 MSSQL로 쿼리 생성 후 전달 시 매개변수 타입을 의도와 다르게 DateTime 으로 설정함.
해결 : MSSQL 컬럼 타입과 매개변수 타입을 DateTime2로 변경.
상세 내용:
의도
데이터 입력 시간을 밀리세컨드 까지 기록하려 함. [예시) 2025-01-01 13:01:00.001]
API서버는 NodeJs로 구성되어 있고, mssql 라이브러리를 require 로 가져와서 사용함.
const msdb = require('mssql');
async dbtest() {
let now = new Date();
console.log(now); //2025-01-01 13:01:00.001
return (await msdb.connect(conf.db)).request()
.input('RMK', msdb.NVarChar, 'Test Remark')
.input('REG_DT', msdb.DateTime, now)
.query(`insert into tb_logs (RMK, REG_DT) values (@RMK, @REG_DT)`);
}
문제 확인
MSSQL DB에서 Select 쿼리로 조회해보면, 간혹 한번씩 1밀리세컨드가 더 크게 들어가 있는 것을 확인함.
console.log로 찍은건 밀리세컨드가 001 인데 MSSQL 서버에서 002로 조회됨.
MSSQL 컬럼 타입을 DateTime2로 변경해서 테스트한 후 문제 원인 추측할 수 있었음.
console.log에서 [2025-01-01 13:01:00.001] 이렇게 보이던 값이
DB에 [2025-01-01 13:01:00.0016667] 과 같이 들어가 있었고, 조회될 때 4번째에서 반올림되어 002로 조회되었음.
문제 해결
MSSQL 컬럼 타입과 Node.js API서버의 매개변수 타입을 msdb.DateTime2로 변경해준 뒤
DB에 [2025-01-01 13:01:00.0010000] 으로 저장됨 확인.
const msdb = require('mssql');
async dbtest() {
let now = new Date();
console.log(now); //2025-01-01 13:01:00.001
return (await msdb.connect(conf.db)).request()
.input('RMK', msdb.NVarChar, 'Test Remark')
.input('REG_DT', msdb.DateTime2, now) //msdb.DateTime -> msdb.DateTime2
.query(`insert into tb_logs (RMK, REG_DT) values (@RMK, @REG_DT)`);
}
-- 위 코드는 상황을 설명하기 위해 재구성하여 작성하였기에 정상적으로 동작하지 않을 수 있습니다.
-- 개인적인 생각.
공식 문서에는 DateTime2가 0.0000001 초까지 기록된다고 되어있는데, node의 mssql 라이브러리 버그인걸까?
mssql은 7.3.5 버전을 사용중...
'Vue2' 카테고리의 다른 글
[Node.js] 1개 노드 서버에서 MSSQL 서버 2개 연결하기 (0) | 2025.02.18 |
---|---|
[Vue] vue/no-v-text-v-html-on-component 오류 해결 (0) | 2025.01.10 |