MySQL

Node.js와 MySQL 연동하기

solfa 2024. 2. 24. 21:39

이어지는 글 >> https://5ffthewall.tistory.com/77

 

MySQL로 DB 구축하고 쿼리문으로 데이터 추가하기

https://www.youtube.com/watch?v=T5dwM_j8wmU&list=PLRx0vPvlEmdD1pSqKZiTihy5rplxecNpz&index=11 나동빈님의 React와 Node.js를 활용한 고객 관리 시스템 개발 강의 예제를 따라하다가 AWS RDS로 DB를 구축하는 과정에서 이것 대

5ffthewall.tistory.com

 

전 글에서 구축한 DB를 토대로 react와 연동해서 데이터를 가져와 보는 것을 할 것이다!

 


 

1. .gitignore 처리

database.json이나 database.js에 데이터베이스의 hostname이나 password를 적어야 하는 경우가 있는데 깃에 연동해둔 프로젝트의 경우 개인정보 보호를 위해 gitignore에 파일을 추가해서 정보가 유출되지 않게 해준다.

이렇게 그냥 넣어준다!

 

2. database.json 설정하기

database.json에서 데이터베이스 정보를 설정해준다

{
    "host": 데이터베이스 주소,
    "user": 데이터베이스 사용자,
    "password": 데이터베이스 비밀번호,
    "port": "3306",
    "database": 데이터베이스 이름
}

나는 MySQL을 썼기 때문에 약간 다른데

MySQL 워크벤치에서 Database - Manage Connections를 누르면

다음처럼 정보가 뜬다! 여기에서 hostname을 host에, username을 user에 써준다

데이터베이스 이름은 table을 만든 드럼통 이름!! 나는 testdb이다

 

3. mysql 모듈 설치하기

npm install mysql

내 프로젝트 디렉토리에 'mysql' 모듈을 설치해 준다. npm으로 mysql을 설치해주고 안되면 sudo 붙이기!

 

4. server.js 코드 수정하기

const fs = require('fs');
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
const port = process.env.PORT || 4200;

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

const data = fs.readFileSync('./database.json');
const conf = JSON.parse(data);
const mysql = require('mysql');

const connection = mysql.createConnection({
    host: conf.host,
    user: conf.user,
    password: conf.password,
    port: conf.port,
    database: conf.database
});

connection.connect((err) => {
    if (err) {
        console.error('Error connecting to database:', err);
        return;
    }
    console.log('Connected to database.');
});

const cors = require('cors'); 
app.use(cors());

app.get('/api/customers', (req, res) => {
    connection.query(
        "SELECT * FROM CUSTOMER", // 데이터 가져오는 쿼리문
        (err, rows, fields) => {
            if (err) {
                console.error('Error querying database:', err);
                res.status(500).send('Error querying database');
                return;
            }
            res.send(rows);
        }
    )
})

app.listen(port, () => console.log(`Listening on port ${port}`));

실질적으로 데이터를 가져오는 코드는 이 부분이다

const fs = require('fs'); 
// 파일 시스템 모듈을 가져온다.
const express = require('express'); 
// Express 프레임워크를 가져온다.
const bodyParser = require('body-parser'); 
// 요청 본문을 파싱하는 미들웨어를 가져온다.
const app = express(); 
// Express 애플리케이션을 생성한다.
const port = process.env.PORT || 4200; 
// 포트 설정! 환경 변수에 지정된 포트가 있으면 해당 포트를 사용하고, 그렇지 않으면 기본값으로 4200을 사용한다.

app.use(bodyParser.json()); 
// JSON 형식의 요청 본문을 파싱할 수 있도록 설정한다.
app.use(bodyParser.urlencoded({ extended: true })); 
// URL-encoded 형식의 요청 본문을 파싱할 수 있도록 설정한다.

const data = fs.readFileSync('./database.json'); 
// 데이터베이스 연결 정보를 담고 있는 JSON 파일을 동기적으로 읽어온다.
const conf = JSON.parse(data); 
// JSON 형식의 데이터를 JavaScript 객체로 변환한다.
const mysql = require('mysql'); 
// MySQL 모듈을 가져온다.

const connection = mysql.createConnection({ 
// MySQL 연결 객체를 생성한다.
    host: conf.host, 
    user: conf.user,
    password: conf.password,
    port: conf.port,
    database: conf.database
});

connection.connect((err) => { 
// MySQL 서버에 연결한다.
    if (err) { 
        console.error('Error connecting to database:', err); 
        return;
    }
    console.log('Connected to database.'); 
});

const cors = require('cors');  
// CORS 미들웨어를 가져온다.
app.use(cors()); 
// CORS 미들웨어를 Express 애플리케이션에 적용한다.

app.get('/api/customers', (req, res) => { 
// '/api/customers' 엔드포인트에 대한 GET 요청 핸들러를 등록한다.
    connection.query( 
    // 데이터베이스에 쿼리를 보낸다.
        "SELECT * FROM CUSTOMER", 
        // CUSTOMER 테이블에서 모든 열을 선택하는 쿼리를 실행한다.
        (err, rows, fields) => { 
        // 쿼리 실행 결과를 처리하는 콜백 함수를 정의한다.
            if (err) { // 쿼리 실행 중 에러가 발생한 경우
                console.error('Error querying database:', err); 
                res.status(500).send('Error querying database');
                return; 
            }
            res.send(rows); 
            // 쿼리 실행 결과를 클라이언트에 응답한다.
        }
    )
})

app.listen(port, () => console.log(`Listening on port ${port}`)); 
// 지정된 포트에서 Express 애플리케이션을 시작하고 서버가 요청을 수신할 준비가 되었음을 콘솔에 출력한다.

+ cors란? 서로 다른 도메인 간 리소스 요청을 처리하는 메커니즘!

 

이렇게 코드를 바꿨는데도... 오류가 난다면...

 

오류 해결 방법

Error connecting to database: Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
// MySQL 클라이언트가 서버에서 요청한 인증 프로토콜을 지원하지 않을 때 발생한다.
// 이는 보안 설정에 관련된 문제이다.

Error querying database: Error: Cannot enqueue Query after fatal error.
// 이 오류는 MySQL 클라이언트가 이미 치명적인 오류가 발생한 후에 쿼리를 추가로 보내려고 시도할 때 발생한다.
// 즉 1번 오류 해결하면 이거 안 생김.

보안 설정으로 내부 데이터 베이스 접속이 되지 않는 경우이다! 이는 workbench에서 서버의 인증 설정을 바꿔주면 해결된다.

 

MySQL 서버의 인증 설정 변경

MySQL 서버의 인증 모드를 변경하여 클라이언트가 지원하는 인증 프로토콜을 사용하도록 설정할 수 있다.

 

1. MySQL 서버에 로그인하고 다음 쿼리를 실행하여 인증 모드를 변경한다.

ALTER USER 'username'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

usernamerpassword자리만 내 껄로 바꿔준다! 이후 쿼리문 실행

 

2. 바뀐 설정을 재적용 해준다.

flush privileges

flush privileges는 MySQL에서 사용자 권한을 다시 불러오고 적용하는 명령이다.

 

이후 서버를 껐다가 다시 yarn dev로 켜주면!

다음과 같이 오류 없이 데이터를 db에서 잘 가져오는 것을 확인할 수 있다.

728x90

'MySQL' 카테고리의 다른 글

MySQL로 DB 구축하고 쿼리문으로 데이터 추가하기  (0) 2024.02.24