Sam Baek, The Dev's Corner

๐Ÿ—ž ์•„๋ฆ„๋‹ต๋‹ค. node pool[4ํŽธ]

23 Jul 2023

AWS RDS๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค๋ฉด, ์‚ฌ์šฉํ•ด๋ณด์ž


AWS์—์„œ RDS๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์„ค์ •ํ–ˆ๋‹ค๋ฉด,
Node๋กœ ์‚ฌ์šฉํ•ด๋ณด๋„๋กํ•˜์ž.
์šฐ์„ ์€, mysql2 ํŒจํ‚ค์ง€ ๋ชจ๋“ˆ์„ ์„ค์น˜ํ•œ๋‹ค.
์ฐธ, RDSํŽธ์—์„œ ์ƒ์„ธํ•œ ์„ค์ • ๋‚ด์šฉ์€ ์ƒ๋žตํ–ˆ์ง€๋งŒ,
RDS์—์„œ ์„ค์ •ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชจ๋“ˆ์„ ์„ค์น˜ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ž.
mysql(aurora๊ฐ€ ์•„๋‹ˆ๋‹ค.)์„ ์„ค์ •ํ–ˆ์œผ๋‹ˆ ๋ชจ๋“ˆ๋„ mysql๋กœ ์„ค์น˜ํ•œ๋‹ค.

const mysql = require('mysql2');

npm์˜ ๊ณต์‹ ์‚ฌ์ดํŠธ์— ๋“ค์–ด๊ฐ€๋ฉด ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ์„ค๋ช…์„ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ๋‹ค.
mysql2๋ฅผ ๊ฒ€์ƒ‰ํ•ด๋ณด๋ฉด ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์„ธ์„ธํ•˜๊ฒŒ ๋‚˜์˜ค๋Š”๋ฐ
์˜ค๋Š˜ ์ •๋ฆฌํ•  ๊ฒƒ์€ createPool ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
pool์€ ๋‚ด ํ”„๋กœ์ ํŠธ์™€ RDS๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

const pool = mysql.createPool({
    host: "", // RDS DB ์—”๋“œํฌ์ธํŠธ
    user: "admin",
    password: "",
    port: 3306,
    database: "db_test",
  });

์œ„ ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด host์—๋Š” RDS DB ์—”๋“œํฌ์ธํŠธ๊ฐ€ ๋“ค์–ด๊ฐ€๊ณ 
user, pw, port๋Š” ์ „๋ถ€ RDS ์ƒ์„ฑํ•  ๋•Œ ์„ค์ •ํ•œ ๋‚ด์šฉ์ด๋‹ค.
database๋Š” ์—†๋‹ค๋ฉด ์ฒ˜์Œ์—” ๊ณต๋ž€์œผ๋กœ ์‹œ์ž‘ํ•˜๊ณ 
RDS์ƒ์„ฑํ•  ๋•Œ ์ถ”๊ฐ€์‚ฌํ•ญ์—์„œ ์ฒ˜์Œ ์ƒ์„ฑ์‹œ DB ์ƒ์„ฑ์„ ์„ค์ •ํ–ˆ๋‹ค๋ฉด
ํ•ด๋‹น ์ด๋ฆ„์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ด์ œ ๋‚ด ํ”„๋กœ์ ํŠธ์™€ RDS๋Š” ์—ฐ๊ฒฐ ๋œ ๊ฒƒ์ด๋‹ค.

pool์„ ์‚ฌ์šฉํ•ด๋ณด์ž


RDS์™€ ์—ฐ๊ฒฐ์ด ๋๋‹ค๋ฉด ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•ด๋ณด์ž
DB์— ๋ญ”๊ฐ€๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„  ์Œ, CRUD ์ž‘์—… ๋“ฑ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„ 
query ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
pool์˜ queryํ•จ์ˆ˜๋Š” ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•œ๋‹ค.

pool.query(`SQL๋ฌธ`, function(err, res, fields){
    console.log(res);
    };
);

๊ทธ๋Ÿผ RDS์˜ DB์— ํ•ด๋‹น SQL๋ฌธ์„ ์ ์šฉ์‹œํ‚ค๊ณ 
์ด๋•Œ err์€ ์—๋Ÿฌ, res๋Š” ๊ฒฐ๊ณผ, fields๋Š” ํ•„๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

DB ์ƒ์„ฑ๊ณผ ํ…Œ์ด๋ธ” ์ƒ์„ฑ


pool์˜ ๋ชจ์Šต์„ ์ •๋ฆฌํ–ˆ์œผ๋‹ˆ ์ด์ œ ์ฝ”๋“œ๋กœ๋งŒ ์ •๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค.

// db talbe ์ƒ์„ฑ
pool.query(`create table notes(
  uuid BINARY(16) DEFAULT (UUID_TO_BIN(UUID())),
  title VARCHAR(255) NOT NULL,
  contents TEXT NOT NULL,
  created TIMESTAMP NOT NULL DEFAULT NOW()
);`, function (err, results, fields) {
  console.log(results);
});

// db ๋‚ด์šฉ ์ถ”๊ฐ€
pool.query(`insert into notes(title, contents) values('My First Note', 'A note about something'), ('My Second Note', 'A note about something else');`, function (err, results, fields) {
  console.log(results);
});

pool CRUDํ•จ์ˆ˜ ๊ตฌํ˜„



// select ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ
function getNotes(){
    pool.query(`select BIN_TO_UUID(uuid,true) as uuid,title,contents,created from notes`, function (err, results, fields) {
    console.log(results);
    });
}

// select ํ•จ์ˆ˜2 ๋งŒ๋“ค๊ธฐ
function getNote(uuid){
    pool.query(`select BIN_TO_UUID(uuid,true) as uuid,title,contents,created from notes where uuid=UUID_TO_BIN('${uuid}', 1);`, function (err, results, fields) {
    // console.log(results); // ๋ณต์ˆ˜๋กœ ๊ฐ€์ ธ์˜จ๋‹ค. ๋ฐฐ์—ด์ฒ˜๋Ÿผ [{}] ์ด๋ ‡๊ฒŒ ๊ฐ€์ ธ์˜จ๋‹ค.
    console.log(...results); // ๋‹จ์ˆ˜๋กœ ๊ฐ€์ ธ์˜จ๋‹ค. {} ์ด๋ ‡๊ฒŒ ๊ฐ€์ ธ์˜จ๋‹ค.
    });
};

// insert ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ
function addNotes(title,contents){
    pool.query(`insert into notes(title, contents) values('${title}','${contents}');`, function (err, results, fields) {
    console.log(results);
    });
};

// update ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ
function updateNotes(uuid,title,contents){
    pool.query(`update notes set title='${title}', contents='${contents}' where uuid=UUID_TO_BIN('${uuid}', 1);`, function (err, results, fields) {
    console.log(results);
    });
}

// delete ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ
function deleteNotes(uuid){
    pool.query(`delete from notes where uuid=UUID_TO_BIN('${uuid}', 1);`, function (err, results, fields) {
    console.log(results);
    });
}