이번에는 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 서버 만들 수 있겠지요? 여기에 부가적인 기능들을 추가해나가시면 될거에요.
'프로그래밍 > Javascript' 카테고리의 다른 글
fastify (2) : 컨트롤러 확장 (0) | 2024.12.06 |
---|---|
fastify (1) : 시작해보기 (0) | 2024.12.03 |
nvm : 여러 버전의 nodejs를 설치하고 관리하기 (0) | 2024.09.09 |
개발환경 구성과 프로젝트 생성 (Hello World) : Vue.js 3 강좌 (with Bootstrap, script-setup) (0) | 2022.03.08 |
Vue.js 3 강좌 (with Bootstrap, script-setup) (0) | 2022.02.04 |