728x90
반응형
지난 번의 MongoDB 모듈화 방식과 동일한 방식으로 진행하였다.
다만, 차이점은 사용하는 MySQL 모듈이 다르다는 점이다.
모듈화를 진행시키기 위해 찾아보는 예제 코드들은 대부분
import mysql from "mysql";
모듈을 사용하였는데....내가 하려는 방법과 맞지 않았다.
아직 공부하는 단계라 해결하는데 원인을 몰랐기에..이틀은 고생한거같다.
막상 이유를 알고보니 너무 단순한 문제...
일단 사용한 코드는 이와 같다.
import { createPool, Pool } from "mysql2/promise";
import dotenv from "dotenv";
dotenv.config();
export namespace DB {
export const config = {
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
host: process.env.DB_HOST,
port: Number(process.env.DB_PORT),
database: process.env.DB_DATABASE,
} as {
user: string,
password: string,
host: string,
port: number,
database: string
};
export class MysqlConn {
private static instance: MysqlConn;
private db?: Pool;
async connect() {
try {
if(this.db) return this.db;
console.warn('DB CONNECT');
this.db = await createPool(config);
return await this.db?.getConnection();
} catch (e) {
throw new Error(e);
}
}
static get getInstance () {
if(!MysqlConn.instance) MysqlConn.instance = new MysqlConn();
return MysqlConn.instance
}
}
}
중요한 점은 mysql 모듈은... promise를 지원하지 않는다는 점이다.
그러다 보니 getConnection() 이부분에서 계속 에러 발생하여 쿼리를 실행시키지 못하였다.
당연한 결과지 연결이 안되었으니까...
찾다보니 promise를 지원하는 mysql 모듈을 사용해야하기 때문에 mysql2 모듈을 다운 받아서 사용했었다.
하지만 이마저도 getConnection() 부분에서 같은 에러가 발생
import { createPool, Pool } from "mysql2/promise";
import를 잘못하여 생긴 에러였다.
mysql2 모듈을 다운 받으면 mysql2/promise가 존재하여 사용할 수 있다.
** dotenv를 app.ts에 사용한다고 명시했는데도 불구하고 인식을 하지 못하기에..DB쪽에도 추가로 선언했다...
controller와 service를 분리하여 사용하였다.
import { DB } from '../../db/db.connect';
export class userService {
constructor() {
}
async login(loginInfo: ILoginInfo){
try {
const { member_id, member_password } = loginInfo;
//암호화
loginInfo.member_password = crypto.createHash('sha512').update(member_password).digest('hex').toString();
const sql = `
SELECT
MEMBER_ID, MEMBER_PASSWORD
FROM
TB_MEMBER
WHERE
MEMBER_ID = ${member_id} AND MEMBER_PASSWORD = ${member_password}
`;
const client = await DB.MysqlConn.getInstance.connect();
const user = await client.query(sql);
console.log(user[0])
return user[0];
} catch (e) {
throw new Error('로그인 정보를 다시 확인해주세요.');
}
}
} // CLASS END
service에서 이와같이 함수를 만들어 사용하였고 controller에서 해당 함수를 불러와 값을 전달하여 프론트에 보내준다.
728x90
반응형
'개발노트 > Node.js' 카테고리의 다른 글
[NodeJS] MySQL 연결 ( Side Project - 스터디 사라져서 중단... ) (0) | 2021.12.03 |
---|---|
[NodeJS] express 프로젝트 생성 ( Side Project - 스터디 사라져서 중단... ) (0) | 2021.12.03 |
[Node.JS] ConnectionPool (0) | 2021.11.30 |
[Node.js] NPM (0) | 2021.09.23 |
[Node.js] Tutorial - 서버 만들기 (0) | 2021.09.23 |