NodeJS 101 โ€” ํŒŒํŠธ 2 MySQL

๋ฐœํ–‰: (2026๋…„ 1์›” 8์ผ ์˜คํ›„ 01:04 GMT+9)
9 min read
์›๋ฌธ: Dev.to

Source: Dev.to

์œ„์— ์ œ๊ณต๋œ ์†Œ์Šค ๋งํฌ ์™ธ์— ๋ฒˆ์—ญํ•  ํ…์ŠคํŠธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฒˆ์—ญ์„ ์›ํ•˜๋Š” ์ „์ฒด ๋‚ด์šฉ์„ ์ œ๊ณตํ•ด ์ฃผ์‹œ๋ฉด ํ•œ๊ตญ์–ด๋กœ ๋ฒˆ์—ญํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

๐Ÿ“– ์„œ๋ฌธ

์ด ๋ฌธ์„œ๋Š” web service ๋˜๋Š” RESTful API ๋ฅผ JavaScript (Node.js) ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๋‹ค์–‘ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ•จ๊ป˜ ๊ฐœ๋ฐœํ•ฉ๋‹ˆ๋‹ค.

  • ๐ŸŒ Express โ€“ HTTP ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ์›น ์„œ๋ฒ„๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค
  • ๐Ÿ—„๏ธ Sequelize โ€“ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ORM
  • ๐Ÿ’พ MySQL โ€“ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
  • ๐Ÿ”ง POSTMAN โ€“ API ํ…Œ์ŠคํŠธ ๋„๊ตฌ

๐Ÿ“š ๋ชฉ์ฐจ

Module 2: ๐Ÿ’พ Basic API MySQL

Express์™€ MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๋ฐ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›๋‹ˆ๋‹ค

โฌ† ๋ชฉ์ฐจ๋กœ ๋Œ์•„๊ฐ€๊ธฐ

Section 2โ€‘1 โ€“ ๐Ÿš€ ์ƒˆ Express ๋ฐ MySQL ์•ฑ ๋งŒ๋“ค๊ธฐ

โฌ† ๋ชฉ์ฐจ๋กœ ๋Œ์•„๊ฐ€๊ธฐ

๐Ÿ“ ์ƒˆ ํ”„๋กœ์ ํŠธ ๋งŒ๋“ค๊ธฐ

  1. ํด๋” demo-mysql ๋งŒ๋“ค๊ธฐ

    mkdir demo-mysql
  2. demo-mysql ํด๋”๋กœ ์ด๋™

    cd demo-mysql

    โš ๏ธ ์ฃผ์˜: ์›๋ณธ ๋ฌธ์„œ์— ๋‚˜์™€ ์žˆ๋Š” cd mkdir demo-mysql ๋ช…๋ น์€ ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํด๋”๋ฅผ ๋งŒ๋“  ํ›„์—๋Š” cd demo-mysql์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค

  3. Node.js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋งŒ๋“ค๊ธฐ

    npm init -y

    ์ด ๋ช…๋ น์€ package.json ํŒŒ์ผ์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค

๐Ÿ“„ index.js ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ

const express = require('express');
const cors = require('cors');          // โœ… cors ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  require('express') ๋Œ€์‹  ์‚ฌ์šฉ
const PORT = process.env.PORT || 5000;
const app = express();

app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(cors());

app.listen(PORT, () => {
    console.log(`CORS enabled server listening on ${PORT}`);
});

โš ๏ธ ์ฃผ์˜: ๊ธฐ์กด ์ฝ”๋“œ์—์„œ๋Š” cors์— require('express')๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ ์ด๋Š” ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. require('cors')๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค

๐Ÿ“ฆ ํ•„์š”ํ•œ ํŒจํ‚ค์ง€ ์„ค์น˜

์ฃผ์š” ํŒจํ‚ค์ง€

npm install express mysql2 cors --save

๊ฐœ๋ฐœ ์˜์กด์„ฑ โ€“ Nodemon

npm install -D nodemon

์ „์—ญ์œผ๋กœ ์„ค์น˜ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด (์„ ํƒ ์‚ฌํ•ญ)

npm install -g nodemon

๐Ÿ“‹ ์„ค์น˜๋œ ํŒจํ‚ค์ง€

PackageDescription
expressNode.js์šฉ ์›น ํ”„๋ ˆ์ž„์›Œํฌ
mysql2Node.js์šฉ MySQL ํด๋ผ์ด์–ธํŠธ
corsCrossโ€‘Origin Resource Sharing์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฏธ๋“ค์›จ์–ด
nodemonํŒŒ์ผ ๋ณ€๊ฒฝ ์‹œ ์„œ๋ฒ„ ์ž๋™ ์žฌ์‹œ์ž‘

Section 2โ€‘2 โ€“ ๐Ÿ”Œ MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ

โฌ† ๋ชฉ์ฐจ๋กœ ๋Œ์•„๊ฐ€๊ธฐ

๐Ÿ“ฆ MySQL2 ๊ฐ€์ ธ์˜ค๊ธฐ

๋‹ค์Œ ์ค„์„ index.js ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค

const mysql = require('mysql2');

๐Ÿ”Œ MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ

๋ฐฉ๋ฒ• 1 โ€“ ์ƒ์ˆ˜ ์‚ฌ์šฉ

const connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'basic_api_express_db'
});

๋ฐฉ๋ฒ• 2 โ€“ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์‚ฌ์šฉ (์ถ”์ฒœ) โญ

const connection = mysql.createConnection({
    host: process.env.DB_HOSTNAME   || 'localhost',
    user: process.env.DB_USERNAME   || 'root',
    password: process.env.DB_PASSWORD || '',
    database: process.env.DB_DATABASE || 'basic_api_express_db'
});

๐Ÿ’ก ์ถ”์ฒœ: ๋ฐฐํฌ ์‹œ ๋ณด์•ˆ๊ณผ ์œ ์—ฐ์„ฑ์„ ์œ„ํ•ด ๋ฐฉ๋ฒ• 2๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”

๐Ÿ“ฅ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ ํ…Œ์ŠคํŠธ

๋‹ค์Œ ์ฝ”๋“œ๋ฅผ index.js์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค

// Get all users
app.get('/users', (req, res) => {
    try {
        connection.query('SELECT * FROM `users`', (err, results) => {
            if (err) {
                return res.status(500).json({ message: "Database error", error: err });
            }
            res.status(200).json(results);
        });
    } catch (error) {
        res.status(400).json({ message: "Get users failed", error: error.message });
    }
});

// Get user by id
app.get('/users/:id', (req, res) => {
    try {
        const id = req.params.id;
        connection.query(
            'SELECT * FROM `users` WHERE `id` = ?',
            [id],
            (err, results) => {
                if (err) {
                    return res.status(500).json({ message: "Database error", error: err });
                }
                if (results.length === 0) {
                    return res.status(404).json({ message: "User not found" });
                }
                res.status(200).json({ payload: results });
            }
        );
    } catch (error) {
        res.status(400).json({ message: "Get user by id failed", error: error.message });
    }
});

๐Ÿงช API ํ…Œ์ŠคํŠธ

GET http://localhost:5000/users
GET http://localhost:5000/users/1

Section 2โ€‘3 โ€“ โž• ์‚ฌ์šฉ์ž ์ƒ์„ฑ

(๋‚ด์šฉ์ด ์•„์ง ์ง€์ •๋˜์ง€ ์•Š์Œ โ€“ ํ•„์š”์— ๋”ฐ๋ผ ์ฝ”๋“œ์™€ ์„ค๋ช…์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”)

Section 2โ€‘4 โ€“ โœ๏ธ ์‚ฌ์šฉ์ž ์—…๋ฐ์ดํŠธ

(๋‚ด์šฉ์ด ์•„์ง ์ง€์ •๋˜์ง€ ์•Š์Œ โ€“ ์ฝ”๋“œ์™€ ์„ค๋ช…์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”)

Source: โ€ฆ

เธญเธ˜เธดเธšเธฒเธขเธ•เนˆเธญเน„เธ›เธ™เธตเน‰เธ•เธฒเธกเธ•เน‰เธญเธ‡เธเธฒเธฃ)*

Section 2โ€‘5 โ€“ ๐Ÿ—‘๏ธ DELETE USER

(เน€เธ™เธทเน‰เธญเธซเธฒเธขเธฑเธ‡เน„เธกเนˆเน„เธ”เน‰เธฃเธฐเธšเธธ โ€“ เนƒเธชเนˆเน‚เธ„เน‰เธ”เนเธฅเธฐเธ„เธณเธญเธ˜เธดเธšเธฒเธขเธ•เนˆเธญเน„เธ›เธ™เธตเน‰เธ•เธฒเธกเธ•เน‰เธญเธ‡เธเธฒเธฃ)


เธซเธกเธฒเธขเน€เธซเธ•เธธ: เธซเธฒเธเธ•เน‰เธญเธ‡เธเธฒเธฃเน€เธžเธดเนˆเธกเธชเนˆเธงเธ™เธ‚เธญเธ‡เธเธฒเธฃเธชเธฃเน‰เธฒเธ‡, เนเธเน‰เน„เธ‚, เนเธฅเธฐเธฅเธšเธœเธนเน‰เนƒเธŠเน‰ เนƒเธซเน‰เธ—เธณเธ•เธฒเธกเธฃเธนเธ›เนเธšเธšเธ‚เธญเธ‡ GET /users เนเธฅเธฐ GET /users/:id เน‚เธ”เธขเนƒเธŠเน‰ INSERT, UPDATE, DELETE เธœเนˆเธฒเธ™ connection.query เธžเธฃเน‰เธญเธกเธˆเธฑเธ”เธเธฒเธฃ error handling เธญเธขเนˆเธฒเธ‡เน€เธ”เธตเธขเธงเธเธฑเธ™.


๋ฒˆ์—ญ

๋‹ค์Œ์€ ํ•„์š”์— ๋”ฐ๋ผ ์„ค๋ช…ํ•˜์‹ญ์‹œ์˜ค)*

Section 2โ€‘5 โ€“ ๐Ÿ—‘๏ธ DELETE USER

(๋‚ด์šฉ์ด ์•„์ง ์ง€์ •๋˜์ง€ ์•Š์Œ โ€“ ํ•„์š”์— ๋”ฐ๋ผ ์ฝ”๋“œ์™€ ์„ค๋ช…์„ ์‚ฝ์ž…ํ•˜์‹ญ์‹œ์˜ค)


์ฐธ๊ณ : ์‚ฌ์šฉ์ž ์ƒ์„ฑ, ์ˆ˜์ •, ์‚ญ์ œ ๋ถ€๋ถ„์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด GET /users ๋ฐ GET /users/:id ํ˜•์‹์„ ๋”ฐ๋ผ INSERT, UPDATE, DELETE๋ฅผ connection.query๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•˜๊ณ  ๋™์ผํ•œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์„ ์ ์šฉํ•˜์‹ญ์‹œ์˜ค.

5000/users/1


Section 2โ€‘3 โ€“ โž• CREATE USER

โฌ† ๋ชฉ์ฐจ๋กœ ๋Œ์•„๊ฐ€๊ธฐ

โž• ์ƒˆ User ๋งŒ๋“ค๊ธฐ

ํŒŒ์ผ์— ์ถ”๊ฐ€: index.js

app.post('/users', (req, res, next) => {
    try {
        const { fname, lname, username, password, avatar } = req.body;

        connection.query(
            'INSERT INTO `users`(`fname`, `lname`, `username`, `password`, `avatar`) VALUES (?, ?, ?, ?, ?)',
            [fname, lname, username, password, avatar],
            (err, results) => {
                if (err) {
                    return res.status(500).json({
                        message: "create user was failed",
                        error: err.message
                    });
                }
                res.status(201).json({
                    message: "create user was successfully",
                    payload: results
                });
            }
        );
    } catch (error) {
        res.status(400).json({
            message: "create user was failed",
            error: error.message
        });
    }
});

๐Ÿ” ์ฝ”๋“œ ์„ค๋ช…

  • INSERT INTO โ€“ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” SQL ๋ช…๋ น
  • ? โ€“ SQL ์ธ์ ์…˜ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ ํ”Œ๋ ˆ์ด์Šคํ™€๋”
  • status(201) โ€“ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ ์„ฑ๊ณต์„ ๋‚˜ํƒ€๋‚ด๋Š” HTTP ์ƒํƒœ ์ฝ”๋“œ

๐Ÿงช API ํ…Œ์ŠคํŠธ

POST http://localhost:5000/users
Content-Type: application/json

{
  "fname": "John",
  "lname": "Doe",
  "username": "johndoe",
  "password": "password123",
  "avatar": "https://example.com/avatar.jpg"
}

Section 2โ€‘4 โ€“ โœ๏ธ UPDATE USER

โฌ† ๋ชฉ์ฐจ๋กœ ๋Œ์•„๊ฐ€๊ธฐ

โœ๏ธ User ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ

ํŒŒ์ผ์— ์ถ”๊ฐ€: index.js

app.put('/users/:id', (req, res, next) => {
    try {
        const id = req.params.id;
        const { fname, lname, username, password, avatar } = req.body;

        connection.query(
            'UPDATE `users` SET `fname`= ?, `lname`= ?, `username`= ?, `password`= ?, `avatar`= ? WHERE id = ?',
            [fname, lname, username, password, avatar, id],
            (err, results) => {
                if (err) {
                    return res.status(500).json({
                        message: "update user was failed",
                        error: err.message
                    });
                }
                if (results.affectedRows === 0) {
                    return res.status(404).json({
                        message: "User not found"
                    });
                }
                res.status(200).json({
                    message: "update user was successfully",
                    payload: results
                });
            }
        );
    } catch (error) {
        res.status(400).json({
            message: "update user was failed",
            error: error.message
        });
    }
});

๐Ÿ” ์ฝ”๋“œ ์„ค๋ช…

  • UPDATE โ€“ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” SQL ๋ช…๋ น
  • affectedRows โ€“ ์—…๋ฐ์ดํŠธ๋œ ํ–‰ ์ˆ˜ (0 = ๋ฐ์ดํ„ฐ ์—†์Œ)

๐Ÿงช API ํ…Œ์ŠคํŠธ

PUT http://localhost:5000/users/1
Content-Type: application/json

{
  "fname": "Jane",
  "lname": "Doe",
  "username": "janedoe",
  "password": "newpassword123",
  "avatar": "https://example.com/new-avatar.jpg"
}

Section 2โ€‘5 โ€“ ๐Ÿ—‘๏ธ DELETE USER

โฌ† ๋ชฉ์ฐจ๋กœ ๋Œ์•„๊ฐ€๊ธฐ

๐Ÿ—‘๏ธ User ๋ฐ์ดํ„ฐ ์‚ญ์ œ

ํŒŒ์ผ์— ์ถ”๊ฐ€: index.js

app.delete('/users/:id', (req, res, next) => {
    try {
        const id = req.params.id;

        connection.query(
            'DELETE FROM `users` WHERE id = ?',
            [id],
            (err, results) => {
                if (err) {
                    return res.status(500).json({
                        message: "delete user was failed",
                        error: err.message
                    });
                }
                if (results.affectedRows === 0) {
                    return res.status(404).json({
                        message: "User not found"
                    });
                }
                res.status(200).json({
                    message: "dele

Source:

te user was successfully",
                    payload: results
                });
            }
        );
    } catch (error) {
        res.status(400).json({
            message: "delete user was failed",
            error: error.message
        });
    }
});

๐Ÿ” ์ฝ”๋“œ ์„ค๋ช…

  • DELETE FROM โ€“ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๋Š” SQL ๋ช…๋ น์–ด
  • affectedRows โ€“ ์‚ญ์ œ๋œ ํ–‰ ์ˆ˜ (0 = ๋ฐ์ดํ„ฐ ์—†์Œ)

๐Ÿงช API ํ…Œ์ŠคํŠธ

DELETE http://localhost:5000/users/1

๐ŸŽ‰ Module 2 ์š”์•ฝ

์šฐ๋ฆฌ๋Š” Express์™€ MySQL Database๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ  CRUD Operations๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค.

MethodEndpointDescription
GET/users๋ชจ๋“  ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ ์กฐํšŒ
GET/users/:idID์— ํ•ด๋‹นํ•˜๋Š” ์‚ฌ์šฉ์ž ์กฐํšŒ
POST/users์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž ์ƒ์„ฑ
PUT/users/:id์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ
DELETE/users/:id์‚ฌ์šฉ์ž ์‚ญ์ œ

Reference

Back to Blog

๊ด€๋ จ ๊ธ€

๋” ๋ณด๊ธฐ ยป

๋‚˜๋Š” ๊ฒฐ๊ตญ ๋ชจ๋“  Express ์ปจํŠธ๋กค๋Ÿฌ์—์„œ try-catch๋ฅผ ์“ฐ๋Š” ๊ฒƒ์„ ๋ฉˆ์ท„๋‹ค (๋‹น์‹ ๋„ ๊ทธ๋ž˜์•ผ ํ•ฉ๋‹ˆ๋‹ค)

ํ‘œ์ง€ ์ด๋ฏธ์ง€: ๋‚˜๋Š” ์ด์ œ ๋ชจ๋“  Express ์ปจํŠธ๋กค๋Ÿฌ์—์„œ try-catch๋ฅผ ์“ฐ๋Š” ๊ฒƒ์„ ๋ฉˆ์ท„๊ณ , ์—ฌ๋Ÿฌ๋ถ„๋„ ๊ทธ๋ž˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2026๋…„์— Node ๋Œ€์‹  Bun์„ ์„ ํƒํ•œ ์ด์œ  (๊ทธ๋ฆฌ๊ณ  ์—ฌ๋Ÿฌ๋ถ„๋„ ๊ทธ๋ž˜์•ผ ํ•˜๋Š” ์ด์œ )

์ˆ˜๋…„๊ฐ„ JavaScript ์ƒํƒœ๊ณ„๋Š” ์•ˆ์ •๋œ ๋“ฏ ๋ณด์˜€๋‹ค: Node๋Š” ํ™•๊ณ ํ•œ ์™•์ด์—ˆ๊ณ , Deno๋Š” ํ•™์ˆ ์ ์ธ ๋Œ€์•ˆ์ด์—ˆ์œผ๋ฉฐ, โ€œspeedโ€๋Š” ๋‹จ์ˆœํžˆ โ€œ์ถฉ๋ถ„ํžˆ ๋น ๋ฆ„โ€์ด์—ˆ๋‹ค. 2026๋…„๊นŒ์ง€๋Š”โ€ฆ

์ดˆ๋ณด์ž๋ฅผ ์œ„ํ•œ JavaScript DOM ์„ค๋ช…

DOM์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”? DOM์€ Document Object Model์˜ ์•ฝ์ž์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ JavaScript๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๋Š” HTML ๋ฌธ์„œ์˜ ํŠธ๋ฆฌโ€‘๊ตฌ์กฐ์™€ ๊ฐ™์€ ํ‘œํ˜„์ž…๋‹ˆ๋‹ค: - ์ฝ๊ธฐ - ๋ณ€๊ฒฝํ•˜๊ธฐ - ์ถ”๊ฐ€ํ•˜๊ธฐ - ์ œ๊ฑฐํ•˜๊ธฐ

์™œ setTimeout์ด Node.js์—์„œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”๊ฐ€ (๊ทธ๋ฆฌ๊ณ  setInterval์ด ์•ฑ์„ ๊นจ๋œจ๋ฆด ์ˆ˜ ์žˆ๋Š” ์ด์œ )

JavaScript ํƒ€์ด๋จธ๋Š” ์ฒ˜์Œ ๋ณด๋ฉด ๋‹จ์ˆœํ•ด ๋ณด์ž…๋‹ˆ๋‹ค: setTimeout๊ณผ setInterval์€ ์ž‘์—…์„ ๋‚˜์ค‘์— ์‹คํ–‰ํ•˜๋„๋ก ์˜ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์—์„œ Node.js๋กœ ์ด๋™ํ•˜๋ฉด, ๋ฏธ๋ฌ˜ํ•˜์ง€๋งŒ ์ค‘์š”ํ•œโ€ฆ