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
반응형
728x90
반응형

 

 

앞에서 간단하게 fastify 프로그램을 만들어보았는데,  이대로 작성을 하면, API가 늘어날 수록 main.js 파일 점점 내용이 많아지고 커질거에요. 그러면, 코드 유지보수에 문제가 있으니, API들을 분류를 해서 분리할 필요가 있습니다. 보통 컨트롤러(controller)라는 이름으로 분리를 합니다. 

 

기존에 작성했던 코드에서 /test1 API가 이었는데, 이것을 별도의 컨트롤러로 분리를 해봅시다. C:\work\fapi 폴더 아래에 controller 폴더를 만듭니다.

그리고, test1.js 도 만들어줍니다.

// controller/test1.js

export async function test1 (fastify, options) {
    fastify.get('/test1', async function (request, reply) {
        return { test1: 'Hi~!!!' };
    })
}

main.js 파일도 다음과 같이 수정해줍니다.

이렇게 하면, API가 늘어나도 계속 controller 폴더 아래에 생성해주고, main.js 에 추가해주면 됩니다. 그런데... 이것이 좀 귀찮습니다. 이 작업을 자동화해주는 모듈이 있는데요. @fastify/autoload 을 사용하겠습니다.

npm i @fastify/autoload 를 실행해서 설치해줍니다.

그리고, main.js 를 아래와 같이 수정해줍니다.

 

그리고, test1.js 파일에 default 를 추가해주어야 한다.

// controller/test1.js

export default async function test1 (fastify, options) {
    fastify.get('/test1', async function (request, reply) {
        return { test1: 'Hi~!!!' };
    })
}

 

이렇게 해놓으면, controller 아래에 파일을 생성하면, 자동으로 컨트롤러로 등록을 해주기 때문에, 더 이상 main.js 에 추가해줄 필요가 없어집니다. 작업하기가 훨씬 편해졌지요. *^^*

 

컨트롤러 확장이 끝났고, 다음에는 MySQL DBMS를 붙여보도록 하지요.

728x90
반응형
728x90
반응형

 

 

우선, nodejs 가 설치되어 있어야겠지요. 저는 nvm 으로 nodejs 를 설치해놓은 상태이고, 버전은 v.20.17.0 입니다.

 

프로젝트 폴더를 만들자. C:\work\fapi 로 하겠습니다. 그리고, 해당 폴더에 들어가서 프로젝트를 초기화 합니다. npm init 을 실행합니다.

모두 엔터를 입력을 해줍니다. 이 중에서 entry point 만 main.js 로 입력해줍니다. 그러면, package.json 파일이 생성됩니다.

package.json 을 열어보면, 아래와 같습니다.

npm install fastify 를 입력해서 fastify를 설치해줍니다.

 

설치가 완료되면, package.json 파일에 dependecies 항목이 새로 생기고, 그 안에 fastify 도 추가된 것을 확인할 수 있습니다.

그리고, C:\work\fapi 폴더 아래에 package-lock.json 파일과 node_modules 폴더가 생긴 것도 볼 수 있어요.

package.json 에 다음 항목을 추가해줍니다. 이것을 해주어야 소스에서 import 키워드를 사용할 수 있어요.

 

이제, 에디터를 열어서 main.js 에 다음을 입력해줍니다.

// main.js

import Fastify from 'fastify';

const fastify = Fastify({
    logger: true
});

fastify.get('/', async function (request, reply) {
    return { hello: 'world' };
});

fastify.get('/test1', async function (request, reply) {
    return { test1: 'world' };
});

const start = async () => {
    try {
        await fastify.listen({ port: 3000 });
    } catch (err) {
        fastify.log.error(err);
        process.exit(1);
    }
};
start();

터미널에서 node main 을 실행해줍니다.

웹브라우저에서 http://localhost:3000 을 입력하면 다음처럼 hello world 나오면 성공~!!!

그리고, http://localhost:3000/test1 이라고도 입력해보면 아래와 같이 나올거에요.

 

설정파일을 별도로 만들어보겠습니다. config.js 파일을 생성하고, 다음 내용을 넣어주세요.

// config.js

export const SERVER_PORT = 3000;

그리고, main.js 에는 다음처럼 변경해주면 되겠습니다.

...

import { SERVER_PORT } from './config.js';

...

        await fastify.listen({ port: SERVER_PORT });

...

 

 

이렇게 해서 아주 간단한 API 서버를 만들어보았습니다. 그런데, API가 늘어날수록 main.js 의 양도 늘어나겠지요. 다음에는 이런것들을 별도의 controller 로 분리하는 법을 알아보겠습니다.

 

728x90
반응형
728x90
반응형

 

 

 

보통은 nodejs 를 설치하려면 공식사이트(https://nodejs.org/)에서 설치파일을 다운로드하여 설치하면 된다. 그런데, 여러 프로젝트를 다루고 있는 상황에서 각 프로젝트마다 다른 버전의 Node를 사용해야 한다면, 문제가 생긴다. 이럴때 nodejs 버전 관리 프로그램을 활용하면 좋을 것이다. node의 버전관리할 수 있는 프로그램은 여러가지가 있는데, 그 중에서 nvm 을 알아보도록 하자.

 

nvm 은 기본적으로 Linux/Mac 등에서 쓸 수 있도록 제작되었다. 그래서, windows를 위해서는 별도의 nvm-windows 라는 것을 찾아서 설치해주어야 한다. https://github.com/coreybutler/nvm-windows 에서 설치파일을 다운로드 할 수 있다. 그렇지만, 이 것보다는 scoop 을 이용해서 설치하겠다. scoop install nvm 이라고 입력하자.

커맨드창을 닫고, 다시 커맨드창을 연다. 그리고, nvm list 라고 입력해보자.

아직 설치한 Nodejs 가 없으므로 나오는 것이 없을 것이다. 이번에는 nvm list available 이라고 입력해보자.

이 중에서 최신 LTS 버전인 20.17.0 을 설치해보자. nvm install 20.17.0 이라고 입력한다.

이렇게 되면, 잘 설치된 것이다. 그러나, 아직 20.17.0 버전을 사용할 수 없다.

사용하려면 위에 나온 것처럼 nvm use 20.17.0 이라고 입력해주어야 한다.

그리고, node --version 이라고 입력하면, 해당 버전이 출력될 것이다. nvm list 라고 입력하면 현재 설치된 node 버전들이 나오게 된다.

이번에는 또 다른 버전의 node 를 설치해보자. nvm install 18.19.1 이라고 입력해서 설치한다. 그리고, nvm list 해서 18.19.1 버전이 설치되었는지도 확인한다.

이제, 새로 설치한 18.19.1 버전으로 스위칭해서 잘 되는지 확인해보자. nvm use 18.19.1 이라 입력하고, nvm list 로 해당 버전이 선택되는지 보고, node --version 으로도 확인해보자.

 

nvm 에 옵션들이 더 있기는 하지만, 이정도만 해도 사용하는데 크게 무리가 없을 것이다.

 

728x90
반응형

+ Recent posts