본문 바로가기
Framework (Backend)/Fastify

fastify (3) : DB(MySQL) 붙여보기

by 가우리언 2024. 12. 10.
728x90
반응형

 

 

이번에는 fastify 프레임워크에 MySQL 을 붙여서 동작시켜보자. https://gauryan.tistory.com/241 을 참고하여 MySQL을 설치하기 바랍니다.

 

이제, mysql 을 이용해서 DB 서버에 접속해보자. mysql -u root -p 라고 입력하고, 비밀번호(test123)까지 입력해보자.

일단 새로운 User를 하나 생성해봅시다.

-- CREATE USER '아이디'@'%' IDENTIFIED BY '비밀번호';
CREATE USER 'test_user'@'%' IDENTIFIED BY 'test123';

자... 그러면... 이제 Database 를 생성해봅시다.

-- CREATE DATABASE 디비이름;
CREATE DATABASE test_db;

test_user 가 test_db 를 사용할 수 있도록 권한을 설정해보자.

-- GRANT ALL PRIVILEGES ON 디비이름.* to 사용자@'%';
GRANT ALL PRIVILEGES ON test_db.* to test_user@'%';

일단 exit 로 mysql 을 빠져나온다. mysql에 test_user로 test_db에 재접속해봅니다.

테스트용으로 테이블을 생성해봅시다.

CREATE TABLE TB_ADMIN
(
    ADMIN_NO INT AUTO_INCREMENT NOT NULL,
    LOGIN_ID VARCHAR(20) NOT NULL UNIQUE,
    PASSWD VARCHAR(20) NOT NULL,
    NICK VARCHAR(20) NOT NULL,
    EMAIL VARCHAR(40),
    PRIMARY KEY (ADMIN_NO)
);

테스용 데이터를 2개 넣어보겠습니다.

INSERT INTO TB_ADMIN(LOGIN_ID, PASSWD, NICK, EMAIL)
VALUES('honggildong', 'ajtwlddl', '홍길동', 'hgd@gmail.com');
 
INSERT INTO TB_ADMIN(LOGIN_ID, PASSWD, NICK, EMAIL)
VALUES('jangnara', 'dlQmsdl', '장나라', 'jnr@gmail.com');

스토어드 프로시저도 하나 만들어봅시다.

DELIMITER $$
CREATE PROCEDURE SP_L_ADMIN()
BEGIN
    SELECT ADMIN_NO, LOGIN_ID, PASSWD, NICK, EMAIL FROM TB_ADMIN;
END $$
DELIMITER;

DB에 접속해서 해당 스토어드 프로시져 호출이 잘 되는지도 확인해 봅시다.

 

여기까지 해서, Database 쪽은 준비가 되었습니다. 이제, fastify 에서 DB 연결부터 조회하는 것까지 해봅시다. ORM 같은 것은 사용하지 않고, 쌩 SQL과 Stored Procedure 를 이용하는 법을 알아봅니다.

 

MySQL 사용을 위해서 https://www.npmjs.com/package/mysql2 모듈을 사용하겠습니다. npm i mysql 2 를 실행해서 설치합니다.

그리고, config.js 에 TEST_DB_CONFIG 항목을 추가해줍니다.

// config.js

export const SERVER_PORT = 3000;

export const TEST_DB_CONFIG = {
    host: 'localhost',
    database: 'test_db',
    port: '3306',
    user: 'test_user',
    password: 'test123',
    waitForConnections: true,
    connectionLimit: 10,
    queueLimit: 0,
    keepAliveInitialDelay: 10000, // 0 by default.
    enableKeepAlive: true, // false by default.
};

main.js 에 MySQL DB 관련 코드를 넣어봅니다.

그리고, 웹브라우저에서 http://localhost:3000 을 호출해서 이렇게 나오면 정상입니다.

http://localhost:3000/test1 을 호출해도 DB 접근할 수 있도록 해봅시다. test1 컨트롤러는 main.js 와는 다른 파일에 있기 때문에, main.js 에 정의되어 있는 TEST_DB_POOL 을 외부에서 접근할 수 있도록 export 를 추가해주어야 합니다. 이렇게 말이지요.

controller/test1.js 파일의 내용을 아래와 같이 수정해줍니다.

// controller/test1.js
import {TEST_DB_POOL} from "../main.js";

export default async function test1 (fastify, options) {
    fastify.get('/test1', async function (request, reply) {
        const [result, fields] = await TEST_DB_POOL.execute("SELECT * FROM TB_ADMIN");
        return result;
    })
}

http://localhost:3000/test1 을 호출해도 DB 내용을 잘 가져옵니다.

그런데 말입니다. main.js 안에 있는 변수를 export 하는것도 좀 거시기 하고, 컨트롤러에서 매번 main.js 를 import 하는 것도 불편합니다. 이 것을 좀더 깔끔하게 만들어주는 것이 바로 decorate 입니다. 먼저, main.js 에서 TEST_DB_POOL 관련된 부분을 아래처럼 바꾸어줍니다.

그리고, controller/test1.js 는 아래와 같이 바꾸어줍니다.

다시, http://localhost:3000/test1 을 호출해도 역시 데이터를 잘 가져올거에요.

 

컨트롤러에 DB 쿼리코드가 들어가는 것이 매우 보기에 좋지 않네요. 지금이야 아주 간단쿼리이니까 특별히 문제 없어 보이지만, 쿼리가 길어지고 복잡해지면, 컨트롤러가 아주 난잡해져요. 그래서, DB쿼리코드 부분을 별도의 Model 로 분리해봅시다.

 

fapi 폴더아래에 model 이라는 폴더를 만듭니다.

그리고, 그 안에 mysql.js 라는 파일을 만들어서 아래 내용을 넣어줍니다.

// model/mysql.js

export async function list_admin(connection) {
    const [result, fields] = await connection.execute("SELECT * FROM TB_ADMIN");
    return result;
}

controller/test1.js 도 다음처럼 수정해줍니다.

// controller/test1.js
import { list_admin } from "../model/mysql.js";

export default async function test1 (fastify, options) {
    fastify.get('/test1', async function (request, reply) {
        const result = await list_admin(this.TEST_DB_POOL);
        return result;
    })
}

이렇게 해서 http://localhost:3000/test1 을 호출해도 데이터 출력이 잘 될 것입니다.

그리고, 처음에 SP_L_ADMIN 이라는 스토어드 프로시저를 만들었는데요. 이것도 한번 호출해봅시다. 이 또한 간단합니다. mode/mysql.js 를 아래처럼 수정해주세요.

다시 http://localhost:3000/test1 를 호출하면 출력이 잘 되지요?

 

 

이렇게 MySQL DB 연결까지 마쳤습니다. 다들 fastify 로 API 서버 만들 수 있겠지요? 여기에 부가적인 기능들을 추가해나가시면 될거에요.

 

 

 

 

 

728x90
반응형

'Framework (Backend) > Fastify' 카테고리의 다른 글

fastify (2) : 컨트롤러 확장  (0) 2024.12.06
fastify (1) : 시작해보기  (0) 2024.12.03