๊ฐœ๋ฐœ Code/์›น๊ฐœ๋ฐœ WebDev

[WebDev][Node.js] Node.js, Express, NoSQL(MongoDB)๋กœ CRUD API ๊ตฌ์ถ•ํ•˜๊ธฐ

5hr1rnp 2025. 1. 31. 22:06
๋ฐ˜์‘ํ˜•

2025.01.30 - [๊ฐœ๋ฐœ Code/์›น๊ฐœ๋ฐœ WebDev] - [WebDev][Node.js] Node.jsํ™˜๊ฒฝ ์„ค์ • ๋ฐ Express.js๋ฅผ ํ™œ์šฉํ•œ ์„œ๋ฒ„ ๋งŒ๋“ค๊ธฐ

2025.01.31 - [๊ฐœ๋ฐœ Code/์›น๊ฐœ๋ฐœ WebDev] - [WebDev][Node.js] Node.js๋กœ REST API ๊ฐœ๋ฐœํ•˜๊ธฐ (CRUD)


1. ๊ฐœ์š”


  • ์ด ๊ธ€์—์„œ๋Š” Node.js์™€ Express๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ NoSQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ธ MongoDB์™€ ์—ฐ๋™ํ•˜์—ฌ CRUD(Create, Read, Update, Delete) ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฃฌ๋‹ค.
  • ์‹ค์Šต์„ ํ†ตํ•ด REST API๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ณผ์ •์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ๋‹ค.

2. ํ”„๋กœ์ ํŠธ ์„ค์ •


2.1. ํ•„์ˆ˜ ํŒจํ‚ค์ง€ ์„ค์น˜

  • ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ ํด๋”๋ฅผ ์ƒ์„ฑํ•˜๊ณ  VSCode์—์„œ ํ•ด๋‹น ํด๋”๋ฅผ ์—ถ:
mkdir my-mongo-api 
cd my-mongo-api
  • npm์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์ดˆ๊ธฐํ™”ํ•จ:
npm init -y
  • ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•จ:
npm install express mongoose body-parser cors dotenv

3. MongoDB ์„ค์ •


3.1. MongoDB Atlas๋ฅผ ์ด์šฉํ•œ ํด๋ผ์šฐ๋“œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑ

  • MongoDB Atlas์—์„œ ๋ฌด๋ฃŒ ๊ณ„์ •์„ ์ƒ์„ฑํ•˜๊ณ  ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์„ค์ •ํ•จ
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๋ฌธ์ž์—ด์„ ๋ณต์‚ฌํ•˜์—ฌ .env ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ €์žฅํ•จ:
MONGO_URI=your_mongodb_connection_string 
PORT=5000

3.2. Mongoose๋ฅผ ํ™œ์šฉํ•œ MongoDB ์—ฐ๊ฒฐ

  • server.js ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด Express ์„œ๋ฒ„๋ฅผ ์„ค์ •ํ•จ:
require('dotenv').config();
const express = require('express');
const mongoose = require('mongoose');
const bodyParser = require('body-parser');
const cors = require('cors');

const app = express();
const PORT = process.env.PORT || 5000;

app.use(cors());
app.use(bodyParser.json());

mongoose.connect(process.env.MONGO_URI, {
    useNewUrlParser: true,
    useUnifiedTopology: true
}).then(() => console.log('MongoDB connected'))
.catch(err => console.log(err));

app.listen(PORT, () => {
    console.log(`Server is running on http://localhost:${PORT}`);
});

4. CRUD API ๊ตฌํ˜„


4.1. ๋ฐ์ดํ„ฐ ๋ชจ๋ธ ์ƒ์„ฑ

  • models/User.js ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด User ๋ชจ๋ธ์„ ์ •์˜ํ•จ:
const mongoose = require('mongoose');

const UserSchema = new mongoose.Schema({
    name: String,
    email: String,
    age: Number
});

module.exports = mongoose.model('User', UserSchema);

4.2. ๋ผ์šฐํ„ฐ ์ƒ์„ฑ

  • routes/userRoutes.js ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  CRUD ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•จ:
const express = require('express');
const router = express.Router();
const User = require('../models/User');

// ์‚ฌ์šฉ์ž ๋ชฉ๋ก ์กฐํšŒ (Read)
router.get('/users', async (req, res) => {
    const users = await User.find();
    res.json(users);
});

// ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž ์ถ”๊ฐ€ (Create)
router.post('/users', async (req, res) => {
    const newUser = new User(req.body);
    await newUser.save();
    res.status(201).json(newUser);
});

// ์‚ฌ์šฉ์ž ์ •๋ณด ์ˆ˜์ • (Update)
router.put('/users/:id', async (req, res) => {
    const updatedUser = await User.findByIdAndUpdate(req.params.id, req.body, { new: true });
    res.json(updatedUser);
});

// ์‚ฌ์šฉ์ž ์‚ญ์ œ (Delete)
router.delete('/users/:id', async (req, res) => {
    await User.findByIdAndDelete(req.params.id);
    res.json({ message: 'User deleted' });
});

module.exports = router;

4.3. ๋ผ์šฐํ„ฐ๋ฅผ ์„œ๋ฒ„์— ์—ฐ๊ฒฐ

  • server.js ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜์—ฌ ๋ผ์šฐํ„ฐ๋ฅผ ๋“ฑ๋กํ•จ:
const userRoutes = require('./routes/userRoutes');
app.use('/api', userRoutes);

5. Postman์„ ์ด์šฉํ•œ API ํ…Œ์ŠคํŠธ


5.1. ์„œ๋ฒ„ ์‹คํ–‰

  • .env ํŒŒ์ผ์ด ์žˆ๋Š” ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์—์„œ ๋‹ค์Œ ๋ช…๋ น์–ด ์‹คํ–‰:
node server.js // nodemon server.js

5.2. API ํ…Œ์ŠคํŠธ

  • GET ์š”์ฒญ (์‚ฌ์šฉ์ž ๋ชฉ๋ก ์กฐํšŒ):
    • GET http://localhost:5000/api/users ์š”์ฒญ์„ ๋ณด๋ƒ„
  • POST ์š”์ฒญ (์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž ์ถ”๊ฐ€):
    • POST http://localhost:5000/api/users
    • Body์— JSON ๋ฐ์ดํ„ฐ ์ž…๋ ฅ:
{
	"name": "5hr1rnp",
	"email": "5hr1rnp@money.com",
	"age": 30
}
  • PUT ์š”์ฒญ (์‚ฌ์šฉ์ž ์ •๋ณด ์ˆ˜์ •):
    • PUT http://localhost:5000/api/users/{id}
    • ์ˆ˜์ •ํ•  ๋ฐ์ดํ„ฐ๋ฅผ JSON ํ˜•์‹์œผ๋กœ ์ž…๋ ฅ ํ›„ ์ „์†ก
  • DELETE ์š”์ฒญ (์‚ฌ์šฉ์ž ์‚ญ์ œ):
    • DELETE http://localhost:5000/api/users/{id} ์š”์ฒญ์„ ๋ณด๋ƒ„
  • MongoDB Cluster์— ์ ‘์†ํ•˜์—ฌ ์ƒ์„ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ํ™•์ธํ•ด๋ณธ๋‹ค

๋ฐ˜์‘ํ˜•