1. mysql 모듈 설치
npm install --save mysql2
2. db.connect.js 생성
import mysql from 'mysql2/promise';
import dotenv from 'dotenv';
dotenv.config();
export const pool = mysql.createPool({
host: process.env.DB_HOST || 'localhost', // mysql의 hostname
user: process.env.DB_USER || 'root', // user 이름
port: process.env.DB_PORT || 3306, // 포트 번호
database: process.env.DB_TABLE || 'db_name', // 데이터베이스 이름
password: process.env.DB_PASSWORD || 'password', // 비밀번호
waitForConnections: true,
// Pool에 획득할 수 있는 connection이 없을 때,
// true면 요청을 queue에 넣고 connection을 사용할 수 있게 되면 요청을 실행하며, false이면 즉시 오류를 내보내고 다시 요청
connectionLimit: 10, // 몇 개의 커넥션을 가지게끔 할 것인지
queueLimit: 0, // getConnection에서 오류가 발생하기 전에 Pool에 대기할 요청의 개수 한도
});
.env 파일 쓰니 아래처럼도 가능
import mysql from 'mysql2/promise';
import dotenv from 'dotenv';
dotenv.config();
export const pool = mysql.createPool({
host: process.env.DB_HOST, // mysql의 hostname
user: process.env.DB_USER, // user 이름
port: process.env.DB_PORT, // 포트 번호
database: process.env.DB_TABLE, // 데이터베이스 이름
password: process.env.DB_PASSWORD, // 비밀번호
waitForConnections: true,
// Pool에 획득할 수 있는 connection이 없을 때,
// true면 요청을 queue에 넣고 connection을 사용할 수 있게 되면 요청을 실행하며, false이면 즉시 오류를 내보내고 다시 요청
connectionLimit: 10, // 몇 개의 커넥션을 가지게끔 할 것인지
queueLimit: 0, // getConnection에서 오류가 발생하기 전에 Pool에 대기할 요청의 개수 한도
});
여기서 dotenv.config();란
- 프로젝트의 루트 디렉토리에 있는 .env 파일 찾아내 사용할 수 있도록 세팅
- 환경 변수를 조금 더 편하게 관리하기 위해 dotenv라는 라이브러리를 사용
- 일반적으로 환경 변수는 process.env로 접근할 수 있음
- dotenv 패키지를 이용하여 환경 변수 파일 (.env)를 외부에 만들어 접근할 수 있도록 함
3. .env 파일 작성
// .env 파일
DB_HOST = localhost
DB_PORT = 3306
DB_USER = root
DB_PASSWORD = "비밀번호"
DB_TABLE = "데이터베이스 이름"
PORT = 3000
NODE_ENV = 'development' # production - 배포 모드, development - 개발 모드
.env 파일은 .gitignore에 추가하기 (보안을 위해)
# dotenv environment variable files
.env
4. DB 연결하기
1. sql 쿼리 작성 (예 : review.sql.js)
export const insertReviewSql =
`
INSERT INTO review (score, body, created_at)
VALUES (?, ?, NOW());
`
2. dao에서 연결 (예 : review.dao.js)
- pool.getConnection(); : mysql connection pool 생성
- pool.query(쿼리문); : DB에 쿼리문 전송하고 데이터 받음
- conn.release(); : connection 반환
import { pool } from "../../config/db.connect.js";
import { status } from "../../config/response.status.js";
import { BaseError } from "../../config/error.js";
import { insertReviewSql } from "../models/review.sql.js"; // 내가 입력한 쿼리문
export const addReviewDao = async () => {
try {
const conn = await pool.getConnection(); // mysql connection pool 생성
// 쿼리 실행
//// 일반 : pool.query(쿼리문)
//// 전달 값 있을 때 : pool.query(쿼리문, [값, 값, ...])
const [review] = await pool.query(insertReviewSql, [
4,
"abcd",
]);
conn.release(); // connection 반환
return review.insertId;
} catch (err) {
throw new BaseError(status.PARAMETER_IS_WRONG);
}
};
5. index.js 작성
dotenv.config(); // .env 파일 사용 (환경 변수 관리)
const app = express();
// server setting - veiw, static, body-parser etc..
app.set('port', process.env.PORT || 3000) // 서버 포트 지정
app.use(cors()); // cors 방식 허용
app.use(express.static('public')); // 정적 파일 접근
app.use(express.json()); // request의 본문을 json으로 해석할 수 있도록 함 (JSON 형태의 요청 body를 파싱하기 위함)
app.use(express.urlencoded({extended: false})); // 단순 객체 문자열 형태로 본문 데이터 해석
// (...)
app.use((err, req, res, next) => {
// 템플릿 엔진 변수 설정
res.locals.message = err.message;
// 개발환경이면 에러를 출력하고 아니면 출력하지 않기
res.locals.error = process.env.NODE_ENV !== 'production' ? err : {};
console.log("error", err);
res.status(err.data.status || status.INTERNAL_SERVER_ERROR).send(response(err.data));
});
app.listen(app.get('port'), () => {
console.log(`Example app listening on port ${app.get('port')}`);
});
'Server > node.js' 카테고리의 다른 글
[node.js] express, restful api (0) | 2024.08.31 |
---|---|
[node.js] Swagger 세팅 (0) | 2024.08.31 |
[AWS] S3 파일 업로드 - node.js (0) | 2024.08.29 |
[CICD] Node.js + Github Action + Elastic Beanstalk 무중단 배포 (3-完) (0) | 2024.08.28 |
[CICD] Node.js + Github Action + Elastic Beanstalk 무중단 배포 (2) (0) | 2024.08.28 |