Node.js 에서 Raw Query를 사용하기 위해서 AWS RDS에서 대여받은 MySQL에 연결을 도와주는 데이터베이스 드라이버가 필요하다. 데이터베이스에 직접 SQL을 요청하고, 테이블을 생성하거나, 데이터를 삽입하는 API를 mysql2 라이브러리를 이용해 구현해보자.

 

Raw Query 라이브러리 설치

# yarn으로 프로젝트를 초기화합니다.
yarn init -y

# express와 mysql 드라이버를 설치합니다.
yarn add express mysql2

 

mysql2는 MySQL 데이터베이스를 Node.js에서 사용할 수 있게 도와주는 라이브러리다.

데이터베이스와 개발 언어 사이를 연결해주는 역할을 담당하기 때문에, 데이터베이스 드라이버라는 이름으로도 불린다.

 

데이터베이스 연결하기

우선, app.js 파일을 만들고, mysql2 라이브러리를 사용해 AWS RDS의 MySQL과 연결을 설정해야 한다.

 

// app.js
import express from 'express';
import mysql from 'mysql2';

const connect = mysql.createConnection({
  host: 'AWS RDS 엔드포인트', // AWS RDS 엔드포인트
  user: 'root', // AWS RDS 계정 명
  password: 'aaaa4321', // AWS RDS 비밀번호
  database: 'express_db', // 연결할 MySQL DB 이름
})

const app = express();
const PORT = 3017;

app.use(express.json());

app.listen(PORT, () => {
  console.log(PORT, '포트로 서버 열림!');
});

 

mysql2 라이브러리를 읽어오고, createConnection() 함수를 이용해 MySQL DB와 연결한다.

 

mysql2 데이터베이스 연결 속성 알아보기

  • host ( mysql2 데이터베이스 드라이버가 접속할 데이터베이스의 주소를 나타낸다. )
  • user ( 데이터베이스의 계정 명을 나타낸다. )
  • password ( 데이터베이스의 비밀번호를 나타낸다. )
  • database ( 데이터베이스의 이름을 나타낸다. )

이 외에도, timezone 으로 시간대를 설정하거나, ssl로 SSL 인증서를 설정하는 등 다양한 옵션을 설정할 수 있다.

 

테이블 생성 API 

CREATE TABLE sql로 테이블을 생성할 수 있다. 

클라이언트로부터 생성할 테이블 이름을 tableName으로 전달받아서 새로운 테이블을 생성해보자.

 

테이블 생성 API 테이블 구조

Name 타입 NULL 제약 조건 default
id ( PK ) INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT
name STRING NOT NULL    
createdAt DATETIME NOT NULL   현재 시간

 

/** 테이블 생성 API **/
app.post('/api/tables/', async (req, res, next) => {
  const { tableName } = req.body;

  await connect.promise().query(`
      CREATE TABLE ${tableName}
      (
          id        INT         NOT NULL AUTO_INCREMENT PRIMARY KEY,
          name      VARCHAR(20) NOT NULL,
          createdAt DATETIME    NOT NULL DEFAULT CURRENT_TIMESTAMP
      )`);

  return res.status(201).json({ message: '테이블 생성에 성공하였습니다.' });
});

 

Raw Query의 사용법

  • mysql2 라이브러리에서 Raw Query는 connect.promise().query() 형식으로 사용한다.

 

테이블 목록 조회 API 

 

SHOW TABLES sql로 테이블을 조회할 수 있다.

/** 테이블 조회 API **/
app.get('/api/tables', async (req, res, next) => {
  const [tableList] = await connect.promise().query('SHOW TABLES');
  const tableNames = tableList.map(table => Object.values(table)[0]);

  return res.status(200).json({ tableList: tableNames });
});

 

Raw Query의 결과값을 const [tableList] 의 형태로 할당하는 이유

  • Raw Query를 사용할 때, CREATE TABLE 명령어와 같이 데이터를 생성하는 명령어의 경우 반환하는 값이 존재하지 않았지만, SHOW TABLES 또는 SELECT 문법의 조회 명령어는 반환값이 존재한다.
  • mysql2의 경우 Raw Query를 이용해 조회된 결과값은 배열의 첫번째에 할당되게 되는데, 그렇기 때문에 배열 구조 분해 할당 문법을 이용해 배열의 첫번째의 값만 tableList 변수에 할당해 사용한다.

 

데이터 삽입 API

 

INSERT INTO sql로 데이터를 삽입할 수 있다.

 

클라이언트로부터 Params로 전달받은 tableName에 해당하는 테이블에 Body 데이터인 name을 삽입하도록 해보자.

/** 데이터 삽입 API **/
app.post('/api/tables/:tableName/items', async (req, res, next) => {
  const { tableName } = req.params;
  const { name } = req.body;

  await connect.promise().query(`
      INSERT INTO ${tableName} (name)
      VALUES ('${name}')`);
  return res.status(201).json({ message: '데이터 생성에 성공하였습니다.' });
});

 

데이터 조회 API

SELECT sql로 데이터를 조회할 수 있다.

 

클라이언트로부터 Params로 전달받은 tableName에 해당하는 테이블의 모든 데이터를 조회해보자.

/** 데이터 조회 API **/
app.get('/api/tables/:tableName/items', async (req, res, next) => {
  const { tableName } = req.params;

  const [itemList] = await connect.promise().query(`
      SELECT id, name, createdAt
      FROM ${tableName}`);

  return res.status(200).json({ itemList: itemList });
});

 

 

'데이터베이스 > 실습' 카테고리의 다른 글

[DATABASE][실습] Prisma 시작하기  (0) 2024.09.06

+ Recent posts