Syw.Frontend

๐Ÿงฉ Vue 2๋กœ ๋ฐฐ์šฐ๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ธฐ์ดˆ

1๋‹จ๊ณ„. Vue 2 + Express + Axios ์ธ์ฆ ๊ธฐ๋ฐ˜ ํˆฌ๋‘์•ฑ ๋งŒ๋“ค๊ธฐ

1-8. RESTful ๊ตฌ์กฐ ์ดํ•ด + ์„œ๋ฒ„ ๋ผ์šฐํ„ฐ ๋ถ„๋ฆฌ

๐ŸŽฏ ํ•™์Šต ๋ชฉํ‘œ

  • RESTful API์˜ ๊ธฐ๋ณธ ์›์น™์„ ์ดํ•ดํ•œ๋‹ค.
  • Express ์„œ๋ฒ„๋ฅผ ๋ผ์šฐํ„ฐ/ํ•ธ๋“ค๋Ÿฌ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ตฌ์กฐํ™”ํ•œ๋‹ค.

โœ… 1. RESTful ๊ตฌ์กฐ๋ž€?

RESTful API๋Š” URL๊ณผ HTTP ๋ฉ”์„œ๋“œ๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ์ž์›์„ ์˜๋ฏธ ์žˆ๊ฒŒ ์„ค๊ณ„ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

๋ฉ”์„œ๋“œ ๊ฒฝ๋กœ ์˜๋ฏธ
GET /todos ๋ชจ๋“  ํ•  ์ผ ์กฐํšŒ
POST /todos ์ƒˆ ํ•  ์ผ ๋“ฑ๋ก
PUT /todos/:id ํŠน์ • ํ•  ์ผ ์ˆ˜์ •
DELETE /todos/:id ํŠน์ • ํ•  ์ผ ์‚ญ์ œ

โœ… "๋™์‚ฌ"๊ฐ€ ์•„๋‹Œ "์ž์› ์ค‘์‹ฌ(๋ช…์‚ฌ)"์˜ URL ์„ค๊ณ„๊ฐ€ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.


โœ… 2. ํด๋” ๊ตฌ์กฐ ๋ฆฌํŒฉํ† ๋ง

vue2-api/
โ”œโ”€โ”€ server.js           # ์„œ๋ฒ„ ์‹คํ–‰ ์—”ํŠธ๋ฆฌ
โ”œโ”€โ”€ routes/
โ”‚   โ””โ”€โ”€ todos.js        # ๋ผ์šฐํ„ฐ ์ •์˜
โ”œโ”€โ”€ data/
โ”‚   โ””โ”€โ”€ todos.json      # ์ €์žฅ๋˜๋Š” JSON ํŒŒ์ผ

โœ… 3. ๋ผ์šฐํ„ฐ ๋ถ„๋ฆฌ โ€“ routes/todos.js

// routes/todos.js
const express = require('express')
const fs = require('fs').promises
const path = require('path')
const router = express.Router()

const DATA_FILE = path.join(__dirname, '../data/todos.json')
let todos = []

// ๐Ÿ“ฆ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ๋ฐ ์ €์žฅ ํ•จ์ˆ˜
const loadTodos = async () => {
  try {
    const data = await fs.readFile(DATA_FILE, 'utf-8')
    todos = JSON.parse(data)
  } catch {
    todos = []
  }
}

const saveTodos = async () => {
  await fs.writeFile(DATA_FILE, JSON.stringify(todos, null, 2))
}

// โœ… GET /todos
router.get('/', async (req, res) => {
  res.json(todos)
})

// โœ… POST /todos
router.post('/', async (req, res) => {
  const newTodo = {
    id: Date.now(),
    title: req.body.title,
    completed: false
  }
  todos.unshift(newTodo)
  await saveTodos()
  res.status(201).json(newTodo)
})

// โœ… DELETE /todos/:id
router.delete('/:id', async (req, res) => {
  const id = Number(req.params.id)
  todos = todos.filter(todo => todo.id !== id)
  await saveTodos()
  res.sendStatus(204)
})

// โœ… PUT /todos/:id
router.put('/:id', async (req, res) => {
  const id = Number(req.params.id)
  const { title } = req.body
  todos = todos.map(todo =>
    todo.id === id ? { ...todo, title } : todo
  )
  await saveTodos()
  res.sendStatus(200)
})

// ์ตœ์ดˆ 1ํšŒ ๋กœ๋“œ
loadTodos()

module.exports = router

โœ… 4. ์„œ๋ฒ„ ์ง„์ž…์  โ€“ server.js

const express = require('express')
const cors = require('cors')
const todosRouter = require('./routes/todos')
const app = express()
const PORT = 3000

app.use(cors())
app.use(express.json())

// โœ… RESTful router ๋“ฑ๋ก
app.use('/todos', todosRouter)

app.listen(PORT, () => {
  console.log(`๐Ÿš€ ์„œ๋ฒ„ ์‹คํ–‰ ์ค‘: http://localhost:${PORT}`)
})

โœ… 5. ์‹คํ–‰ ๋ฐฉ๋ฒ•

์‹คํ–‰ํ•˜๊ธฐ ์ „ ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— data ํด๋”๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. data ํด๋”๊ฐ€ ์—†์œผ๋ฉด ๋ฐ์ดํ„ฐ๋Š” ์ €์žฅ๋˜์ง€๋งŒ ์„œ๋ฒ„์—์„œ ์—๋Ÿฌ๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค.

node server.js

๐Ÿง  ํ•ต์‹ฌ ์š”์•ฝ

๊ตฌ์„ฑ ์š”์†Œ ์„ค๋ช…
routes/todos.js API ๊ฒฝ๋กœ๋ณ„ ๋ผ์šฐํ„ฐ ๋‹ด๋‹น
server.js ์„œ๋ฒ„ ์ „์ฒด ๊ตฌ์„ฑ ๋ฐ ๋ผ์šฐํ„ฐ ์—ฐ๊ฒฐ
todos.json ๋ฐ์ดํ„ฐ ์˜์† ์ €์žฅ์†Œ
RESTful ์›์น™ ๊ฒฝ๋กœ๋Š” ์ž์›, ๋ฉ”์„œ๋“œ๋Š” ํ–‰๋™์„ ์˜๋ฏธ

BE ์ €์žฅ์†Œ

GitHub - heroyooi/vue2-api at ch8

๐Ÿ’ฌ ๋Œ“๊ธ€

    โ€ป ๋กœ๊ทธ์ธ ํ›„ ๋Œ“๊ธ€์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.