๊ด€๋ฆฌ ๋ฉ”๋‰ด

<Hello Hosung๐Ÿ˜Ž/>

[Node.js] Node.js(Express) ↔๏ธŽ MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๐Ÿ“ฆ ์—ฐ๋™ํ•˜๊ธฐ ๋ณธ๋ฌธ

๐Ÿ“ฑ JavaScript/ใ…คNode

[Node.js] Node.js(Express) ↔๏ธŽ MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๐Ÿ“ฆ ์—ฐ๋™ํ•˜๊ธฐ

์ขŒ์ถฉ์šฐ๋Œ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž ์ผ๊ธฐ๐Ÿง 2024. 9. 23. 13:06

 
์ด๋ฒˆ์—” Node.js ์™€ MySQL ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™๊ณผ ๋˜ํ•œ mybatis-mapper ๋ฅผ ํ™œ์šฉ ํ•˜๋Š” ๋ฐฉ๋ฒ• ๋˜ํ•œ ์•Œ์•„ ๋ณด๋„๋ก ํ•ด์š”๐Ÿ˜€

 
๋จผ์ € ์•„๋ž˜์™€ ๊ฐ™์ด ๋„์ปค ํ™˜๊ฒฝ์— MySQL ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์˜ฌ๋ผ ๊ฐ”๋‹ค๊ณ  ๊ฐ€์ • ํ•ด๋ด…์‹œ๋‹ค!
 
(๋„์ปค๋ฅผ ํ†ตํ•ด MySQL DB ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•ด์š”) โ†“ โ†“ โ†“
2024.08.18 - [๐Ÿณ Docker] - [Docker] ๋„์ปค๋กœ MySQL DB๐Ÿ“ฆ ์„œ๋ฒ„ ๋งŒ๋“ค์–ด๋ณด๊ธฐ

MYSQL-CONTAINER, MySQL DB ์„œ๋ฒ„

 
 
๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด Node.js๋กœ ์ž‘์„ฑํ•œ Express ์„œ๋ฒ„๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณผ๊ฒŒ์š”.
 
Express๋Š” Node.js๋ฅผ ์œ„ํ•œ ๋น ๋ฅด๊ณ  ๊ฐ„๋‹จํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ์—์š”. ๐Ÿง

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ, ํŠนํžˆ REST API๋‚˜ ์›น ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•  ๋•Œ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 
 
์„œ๋ฒ„๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ธฐ์ „ ๋‚ด MySQL ๊ณผ ์ ‘์†์ด ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธ์„ ํ•˜๊ธฐ์œ„ํ•ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณผ๊ฒŒ์š”. ์—ฌ๊ธฐ์„œ ์‚ฌ์šฉ๋  ํŒŒ์ผ์€ ์•„๋ž˜์™€ ๊ฐ™์•„์š”
 
ใ†src/config/database.js
ใ†src/database.js
ใ†.env
 
 

[.env]

ํ•ด๋‹น ํŒŒ์ผ์€ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉ๋  ์ „์—ญ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋Š” ํŒŒ์ผ์ด์—์š”.
ํ•ด๋‹น ํŒŒ์ผ์— ๋Œ€ํ•˜์„œ ์ „์—ญ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์ด dotenv๋ฅผ ์„ค์น˜ํ•ด์•ผ ๋˜์š” (https://www.npmjs.com/package/dotenv)

npm install dotenv --save

 
๊ทธ ์ดํ›„ ์•„๋ž˜์™€ ๊ฐ™์ด DB์˜ ์„ค์ •์ •๋ณด๋“ค์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

 
 

[database .js]

์ด ์ฝ”๋“œ๋Š” Node.js์—์„œ MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด mysql2/promise ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜(.env)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์„ค์ •์ด์—์š”

 
1. require("dotenv").config();
dotenv ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” .env ํŒŒ์ผ์— ์ €์žฅ๋œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋กœ๋“œํ•˜์—ฌ Node.js์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
.env ํŒŒ์ผ์—๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ •๋ณด์™€ ๊ฐ™์ด ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•ด ๋‘๊ณ , ์ด ํŒŒ์ผ์„ dotenv๋ฅผ ํ†ตํ•ด ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค.

2. const mysql = require("mysql2/promise");
ํ•ด๋‹น ๋ชจ๋“ˆ์€ MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋น„๋™๊ธฐ์ ์œผ๋กœ ์—ฐ๊ฒฐํ•˜๊ณ  ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” MySQL ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.
์ด ๋ชจ๋“ˆ์€ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— async/await ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์ž‘์—…์„ ๋ณด๋‹ค ์ง๊ด€์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. const pool = mysql.createPool({ ... });
createPool ๋ฉ”์„œ๋“œ๋Š” MySQL ์—ฐ๊ฒฐ ํ’€(connection pool)์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
์—ฐ๊ฒฐ ํ’€์€ ๋ฏธ๋ฆฌ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ๋งŒ๋“ค์–ด ๋†“๊ณ , ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋˜๊ณ , ์—ฌ๋Ÿฌ ์š”์ฒญ์ด ๋™์‹œ์— ๋“ค์–ด์™€๋„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

[server.js]

์ด ์ฝ”๋“œ๋Š” Node.js๋กœ ์ž‘์„ฑ๋œ Express.js ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋ฅผ ๊ตฌ๋™ํ•˜๊ณ , MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ํ™•์ธํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

 
 
์œ„ ์†Œ์Šค์ค‘  ์ค‘์š”์‹œ ๋ด์•ผ ํ•  ๊ฑด " // ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ถ€๋ถ„ " ์ด๊ณ  ํ•ด๋‹น ๋‚ด์šฉ์— ๋Œ€ํ•œ ์„ค๋ช…์€ ์•„๋ž˜์™€ ๊ฐ™์•„์š”
 
1. ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ์ฆ‰์‹œ ์‹คํ–‰ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

2. **pool.query("SELECT 1");**๋Š” ๊ฐ„๋‹จํ•œ ์ฟผ๋ฆฌ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ด๋ฃจ์–ด์กŒ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฉด Database connection successful ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๊ณ , ์‹คํŒจํ•˜๋ฉด ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

3. **SELECT 1**์€ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์–ด๋– ํ•œ ๋ณ€ํ™”๋„ ์ฃผ์ง€ ์•Š๋Š” ๊ฐ„๋‹จํ•œ ์ฟผ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 
์ด๋ ‡๊ฒŒ Express + MySQL ์„ ์—ฐ๋™์„ ํ•ด๋ณด์•˜๊ณ  ๋‹ค์Œ์—๋Š” mybatis-mapper ์‚ฌ์šฉํ•˜์—ฌ ORM ์ฒ˜๋Ÿผ ์ฟผ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฒ•์„ ํ•ด๋ณผ๊ฒŒ์š”๐Ÿ˜€