[Node.js] Node와 Mysql 연동하기 쿼리문 사용법, node.js, 데이터베이스 연동(Mysql)

728x90

프로젝트에서 사용하는 DB는 Mysql을 사용하게 되었습니다. 흔히 프로젝트에서 DB와 연동하는 일은 한번쯤은 꼭 있습니다. 그래서 오늘은  기록용 겸 포스팅 겸 해서 올려보겠습니다. 

 

저는 .env 환경변수 저장하는 파일 생성해서 DB에 접속하는 코드를 작성하도록 하겠습니다.

 

 

1. npm install mysql2

npm install mysql2

Node.js에서 MySQL 데이터베이스와 상호작용하기 위한 패키지입니다.

mysql과 mysql2 가 있는데 mysql2이 계속 버전업 되고 있는 패키지입니다.(mysql2를 사용했습니다)

 

 

 

2. DB 연동하는 파일

const mysql = require('mysql2/promise');

console.log('db.js, ', 
    process.env.DB_HOST, process.env.DB_PORT, 
    process.env.DB_USER, process.env.DB_PASSWORD,
    process.env.DB_NAME
)

// connection보다 pool이 더 좋대 gpt
const db = mysql.createPool(
    {
        host : process.env.DB_HOST,
        port: process.env.DB_PORT,
        user:  process.env.DB_USER,
        password: process.env.DB_PASSWORD,
        database: process.env.DB_NAME,
        connectionLimit: 10, // 최대 연결 수
    }
);

module.exports = {db};

 

원래는 CreateConnection을 사용하는 걸 많이 봤는데 프론트엔드 프로젝트 내에서 Promise를 사용하여 비동기 async/await를 사용한다면 createPool로 생성해주는게 좋습니다.

 

만약 .env 파일을 생성하지 않았다면 

// connection보다 pool이 더 좋대 gpt
const db = mysql.createPool(
    {
        host : 'DB 호스트',
        port: 'DB 포트번호',
        user:  'DB 사용자',
        password: 'DB 비밀번호',
        database: 'DB 데이터 베이스 명',
        connectionLimit: 10, // 최대 연결 수
    }
);

위와 같이 생성해주면 됩니다.

module.exports = {db} 코드로 다른 파일에서 가져올 수 있도록 export 해줍니다.

 

 

3-1. DB 쿼리문 (select)

const {db} = require('../config/db');


const getAllUsers = async() => {
    console.log('repository 진입')
    const [rows] = await db.query('SELECT * FROM LC_USER_T');
    console.log('repository', rows)
    return rows;
}

DB 파일에서 코드 가져오고, async/ await를 사용해서 객체를 만들어줍니다.

db.query('쿼리문'); 을 사용해서 데이터를 select 해주면 됩니다.

 

3-2. DB 쿼리문 (insert)

const {db} = require('../config/db');

const insertUser = async(userData) => {
    try{
        const {email, name, password, user_type} = userData;
        console.log('repository 진입', userData)
        const result = await db.execute(
            "INSERT INTO LC_USER_T(email, name, password, user_type ) VALUES (?, ?, ?, ? )",
            [email, name, password, user_type])
        return result;
    }catch(error){
        return error;
    }
}

DB 파일 가져오는 것은 동일하고 insert에서도 async/await를 해줍니다.

파라미터값을 바로 보내면 안되더라구요. insert할 데이터와 쿼리문의 형식이 동일해야 합니다! 꼭 기억하세요

만약에 .query를 사용하고 싶다면 사용할 수 있습니다. 살짝 다른 코드입니다

const insertUser = async (userData) => {
    try {
        const query = `
            INSERT INTO users (user_type, password, name, email)
            VALUES (
                ${db.escape(userData.user_type)},
                ${db.escape(userData.password)},
                ${db.escape(userData.name)},
                ${db.escape(userData.email)}
            )
        `;

        const [result] = await db.query(query);
        console.log('Insert result:', result);
        return result;
    } catch (error) {
        console.error('Error inserting user:', error);
        throw error;
    }
};

DB연동파일명. execute("쿼리문", [data1, data2, datat3, ...])

 

delete, update도 동일합니다. 모두 executed와 qurey 사용가능합니다.(qpt쿼리)

 

3-3. DB 쿼리문(delete)

execute 사용 시 

const deleteUser = async (userId) => {
    try {
        const [result] = await db.execute(
            'DELETE FROM users WHERE id = ?', [userId]
        );
        console.log('Delete result:', result);
        return result;
    } catch (error) {
        console.error('Error deleting user:', error);
        throw error;
    }
};

query 사용 시

const deleteUser = async (userId) => {
    try {
        const [result] = await db.query(
            `DELETE FROM users WHERE id = ${db.escape(userId)}`
        );
        console.log('Delete result:', result);
        return result;
    } catch (error) {
        console.error('Error deleting user:', error);
        throw error;
    }
};

 

 

3-4 쿼리문(update)

execute 사용 시

const updateUser = async (userId, email) => {
    try {
        const [result] = await db.execute(
            'UPDATE users SET email = ? WHERE id = ?',
            [email, userId]
        );
        console.log('Update result:', result);
        return result;
    } catch (error) {
        console.error('Error updating user:', error);
        throw error;
    }
};

query 사용 시

const updateUser = async (userId, email) => {
    try {
        const [result] = await db.query(
            `UPDATE users SET email = ${db.escape(email)} WHERE id = ${db.escape(userId)}`
        );
        console.log('Update result:', result);
        return result;
    } catch (error) {
        console.error('Error updating user:', error);
        throw error;
    }
};

 

execute를 사용할 때에는 매개변수값을 잘 지정해주면 되는데 만약 query를 사용하면 DB.escape를 사용하여 Query injection을 방지해주면됩니다.

이런 방식으로 로그인까지 완료했고 토큰 생성까지 완료했습니다. 빨리 만들어보고 검증할 수 있었으면 좋겠습니다.

 

728x90