Java Script/Node.js

[Node.js] DB연결 / ER_NOT_SUPPORTED_AUTH_MODE 오류

웹개발자(진) 2024. 5. 13. 22:01
반응형
잡담

오늘은 메모리에서만 생성 수정했던 데이터들을 DB를 활용해서 HTTP 호출을 해볼 예정입니다. DB는 MySQL을 사용할 예정이고 오늘도 POSTMAN을 이용해서 UI를 대신할 예정입니다. DB에 연결하게 되면 이제 값들을 저장할 수 있게 되고 해당 데이터들을 react나 html를 이용해서 view로 뿌려줄 수 있게 될 것입니다. 


바쁘신분은 해당 링크 클릭하시면 됩니다.

목차이동(클릭)

 

1. DB생성

기본적인 workbench 사용

우선 첫번째로 연결시킬 DB를 생성하도록 하겠습니다. DB생성에는 MySQL Workbench를 이용해도 되지만 오늘은 커맨드연습도 할 겸 Command Line Client를 이용하도록 하겠습니다.

Command Line Client 사용

Client를 실행시키면 처음에 'Enter password:' 라고해서 비밀번호를 입력하게 됩니다. 해당 비밀번호는 MySQL에 접속할 때 입력하는 password와 같습니다.

비밀번호입력

 


 

데이터베이스 생성

CREATE DATABASE 데이터베이스 이름;

데이터베이스를 생성하기위해 Create문을 사용해서 데이터베이스 이름을 지정해 줍니다. 저는 데이터베이스 이름을 practice로 지정해 보겠습니다.


 

해당 데이터베이스로 이동

USE 데이터베이스 이름

USE 지정 데이터베이스이름을 통해서 테이블을 추가하고자 하는 데이터베이스로 이동합니다.

 


 

테이블 생성

CREATE TABLE PERSON(
	NAME VARCHAR(10) PRIMARY KEY,
    	AGE INT NOT NULL,
    	HEIGHT DOUBLE NOT NULL
);

TABLE 생성 query문을 이용해서 테이블을 생성해 줍니다. sql문은 동일합니다.

 


 

데이터 INSERT

INSERT INTO 테이블이름 (name, age, height) VALUES ('John', 30, 175.5);
INSERT INTO 테이블이름 (name, age, height) VALUES ('Alice', 25, 162.3);
INSERT INTO 테이블이름 (name, age, height) VALUES ('Bob', 40, 180.0);

연습에 필요한 데이터들을 INSERT문을 이용해서 추가해 줍니다. 데이터베이스가 잘 생성됐는지 데이터가 잘 들어갔는지 확인해 줍니다.

SELECT * FROM 테이블이름

SELECT * FROM 테이블명

 


 

2. DB연결

Node.js에서 MySQL 데이터베이스에 연결하는 방법은 다음과 같습니다. 먼저, MySQL과 Node.js를 연결하기 위해 mysql 모듈을 설치해야 합니다. 프로젝트 폴더에서 다음 명령을 실행하여 모듈을 설치할 수 있습니다:

npm install mysql

모듈을 설치한 후에는 아래와 같이 Node.js에서 MySQL 데이터베이스에 연결할 수 있습니다:

DB정보

var mysql = require('mysql')

const db = mysql.createPool({
    host:'localhost',
    user:'root',
    password:'1234',
    database:'practice',
    port:3306
})

module.exports=db;


이 코드는 Node.js에서 MySQL 데이터베이스에 연결하기 위해 사용되는 코드입니다. 여기서 MySQL 패키지를 사용하여 데이터베이스와의 연결을 설정하고 데이터베이스 풀을 만듭니다. (경로 : config/db.js)

  1. MySQL 모듈 불러오기: 코드의 첫 번째 줄은 MySQL 모듈을 불러오는 부분입니다. 이를 통해 MySQL과 상호작용할 수 있는 메서드와 클래스에 접근할 수 있습니다.
  2. 데이터베이스 연결 설정: 다음은 데이터베이스 연결 정보를 포함한 객체입니다. 이 정보는 MySQL 데이터베이스에 연결할 때 사용됩니다. 객체에는 호스트 이름, 사용자 이름, 비밀번호, 데이터베이스 이름 및 포트 번호가 포함되어 있습니다.
  3. 데이터베이스 풀 생성: mysql.createPool() 메서드를 사용하여 데이터베이스 연결을 관리하는 풀(pool)을 만듭니다. 이를 통해 여러 클라이언트가 동시에 데이터베이스에 연결하고 쿼리를 실행할 수 있습니다. 이 방법은 성능을 향상하고 데이터베이스 연결을 효율적으로 관리할 수 있도록 도와줍니다.
  4. 모듈 내보내기: 마지막으로, 생성된 데이터베이스 풀을 모듈로 내보냅니다. 이렇게 함으로써 다른 파일에서 이 모듈을 불러와 사용할 수 있습니다.

 


DB데이터 호출


이 코드는 Express 애플리케이션에서 GET 요청을 처리하여 MySQL 데이터베이스의 'person' 테이블에서 데이터를 가져오는 엔드포인트를 설정합니다.

1. Express 및 필수 모듈 로드:

const express = require('express');
const app = express();
const port = 3000;
const db = require('./config/db.js');

 

2. Express 애플리케이션 설정:

app.use(express.json());

 

이 코드는 Express 애플리케이션에서 JSON 형식의 요청을 처리하기 위해 필요한 미들웨어를 설정합니다.

 

3. GET 요청 처리:

app.get('/person', (req, res) => {
    db.query('select * from person', (err, data) => {
        if (!err) {
            console.log(data);
            res.send(data);
        } else {
            res.send(err);
        }
    });
});

이 코드는 '/person' 엔드포인트에 대한 GET 요청을 처리합니다. 클라이언트가 '/person' 엔드포인트에 GET 요청을 보내면, 데이터베이스에서 'person' 테이블의 모든 데이터를 검색합니다. 데이터베이스 쿼리의 결과에 따라 적절한 응답이 전송됩니다. 오류가 없으면 데이터가 콘솔에 출력되고 응답으로 전송됩니다. 오류가 발생하면 오류가 응답으로 전송됩니다.

이러한 코드를 사용하면 Express 애플리케이션에서 MySQL 데이터베이스에 쉽게 연결하고 데이터를 검색할 수 있습니다. 요청이 들어오면 해당 데이터를 응답으로 반환하는 간단한 RESTful API를 만들 수 있습니다.

출력을 확인하려고 하면?


 

 

에러 발생

이 오류는 MySQL 클라이언트가 서버에서 요청한 인증 프로토콜을 지원하지 않아 발생합니다. 이 오류는 일반적으로 MySQL 8 이상의 버전에서 새로운 기본 인증 플러그인을 사용할 때 발생할 수 있습니다.

// http://localhost:3000/person

{
  "code": "ER_NOT_SUPPORTED_AUTH_MODE",
  "errno": 1251,
  "sqlMessage": "Client does not support authentication protocol requested by server; consider upgrading MySQL client",
  "sqlState": "08004",
  "fatal": true
}

 

해결방법

MySQL 사용자의 인증 방법 변경: MySQL 사용자의 인증 방법을 변경하여 이 오류를 해결할 수 있습니다. MySQL 8 이상에서는 기본적으로 caching_sha2_password 인증 플러그인을 사용합니다. 그러나 이전 버전의 MySQL 클라이언트는 이를 지원하지 않을 수 있습니다. 따라서 MySQL 사용자의 인증 방법을 mysql_native_password로 변경하는 것이 좋습니다.

ALTER USER '사용자명'@'호스트' IDENTIFIED WITH mysql_native_password BY '새로운비밀번호';

여기서 '사용자명'은 MySQL 사용자 이름이고 '호스트'는 사용자가 접속하는 호스트입니다. '새로운 비밀번호'는 변경하려는 새로운 비밀번호입니다.


 

출력값

// http://localhost:3000/person

[
  {
    "NAME": "Alice",
    "AGE": 25,
    "HEIGHT": 162.3
  },
  {
    "NAME": "Bob",
    "AGE": 40,
    "HEIGHT": 180
  },
  {
    "NAME": "John",
    "AGE": 30,
    "HEIGHT": 175.5
  }
]

 


 

글을 마치며

Command Line Client을 사용해서 DB생성, Table생성을 진행해 봤고 Node.js DB연결을 해보았습니다. Node.js에서 MySQL 데이터베이스에서 데이터를 선택하면 일반적으로 JSON 형식으로 결과를 가져옵니다. DB연결을 했으면 다음에는 뭘 할까요? 자연스럽게 CRUD를 만들 수 있을 것입니다. 다음시간에는 DB를 활용해서 CRUD문을 만들어 보도록 하겠습니다. 

반응형