Project 4 #3 / TIL

API 구현 / MySQL 테이블 생성

Featured image

CRUD API 코드 설명

CRUD API는 파일을 따로 나누지 않고 root.js에 통합하여 코드를 작성하였다.


1. MySQL 연결 설정


// mysql.js
module.exports = fp(async function (fastify, opts) {
    const url = `mysql://${process.env.DB_USER}:${process.env.DB_PASSWORD}@${process.env.DB_HOST}:3306/${process.env.DB_NAME}`
    fastify.register(require('@fastify/mysql'), {
        promise: true,
        connectionString: url
    })
})

fastify 플러그인을 이용해 MySQL 연결 문자열을 구성하는데, url을 환경 변수로 구성하여 민감한 정보가 노출되지 않게 하였다. fastify.register 함수의 connectString 옵션은 이전에 구성한 MySQL 연결 URL로 설정하여 플러그인에 연결할 MySQL 서버와 사용할 데이터베이스를 지정한다.


2. RDS Table 생성


User 테이블 생성 쿼리

CREATE TABLE User ( email VARCHAR(50) NOT NULL, username VARCHAR(20) NOT NULL, password VARCHAR(20) NOT NULL, PRIMARY KEY (email) );

Task 테이블 생성 쿼리

CREATE TABLE Task ( Task_id INT NOT NULL AUTO_INCREMENT, Supervisor_email VARCHAR(50) NOT NULL, PIC_email VARCHAR(50) NOT NULL, Task_name VARCHAR(50) NOT NULL, Task_contents VARCHAR(2000) NOT NULL, Task_status VARCHAR(20) NOT NULL, Deadline VARCHAR(20), PRIMARY KEY (Task_id), FOREIGN KEY (Supervisor_email) REFERENCES User(email), FOREIGN KEY (PIC_email) REFERENCES User(email) );

Task 테이블의 Supervisor_email과 PIC_email이 User 테이블의 email을 참조하도록 설정했기 때문에 User 테이블을 먼저 생성한 후, 그 다음에 Task 테이블을 생성해주었다.


3. CRUD API 코드


fastify.post('/', async function (request, reply) {
    const Task_id = request.params.taskId;
    const { Task_name, Task_contents, Task_status, Deadline, PIC_email, Supervisor_email } = request.body;
    }

    const mysql = fastify.mysql;
    const query = `INSERT INTO Task (Task_name, Task_contents, Task_status, Deadline, PIC_email, Supervisor_email) 
    VALUES ('${Task_name}','${Task_contents}','${Task_status}', '${Deadline}', '${PIC_email}', '${Supervisor_email}')`;
    
    const result = await mysql.query(query);
    console.log("mysql completed");
    reply.code(200).send(result[0])
});

request.params.taskId를 통해 요청의 경로 매개변수인 taskId 값을 가져오고, request.body를 통해 요청의 본문(body) 데이터를 가져온다. 본문은 JSON 형식으로 Task 관련 정보인 Task_name, Task_contents, Task_status, Deadline, PIC_email, Supervisor_email과 같은 필드들을 분해할당(destructuring assignment)을 통해 변수에 저장한다.

mysql 객체를 얻어 쿼리를 실행할 수 있게하고, query 변수에 실행해야 할 쿼리를 작성한다. mysql.query 메서드에 await 키워드를 사용하여 비동기로 쿼리를 실행하고, 결과를 result 변수에 저장한다. result는 쿼리 실행 결과의 배열이다.

결과적으로 응답으로 상태코드 200과, 쿼리 실행 결과의 첫 번째 요소를 반환한다. 로컬에서 이 함수를 실행한다고 가정했을 때, http://localhost:3000 로 post 요청을 보낼 시 쿼리의 내용을 실행한 결과가 데이터베이스에 기록되고 콘솔로 출력된다.

위와 같은 흐름으로 get, put, delete 메서드도 작성되었고, 각각의 쿼리 내용은 다음과 같다.

// GET
SELECT * FROM Task

// POST
INSERT INTO Task (Task_name, Task_contents, Task_status, Deadline, PIC_email, Supervisor_email) VALUES ('${Task_name}','${Task_contents}','${Task_status}', '${Deadline}', '${PIC_email}', '${Supervisor_email}')

// PUT
UPDATE Task SET Task_name = '${Task_name}'

// DELETE 
DELETE FROM Task WHERE Task_id = '${Task_id}'