🎯 νšŒμ› API에 λŒ€ν•œ μ˜ˆμ™Έ 처리λ₯Ό HTTP μƒνƒœ μ½”λ“œλ₯Ό ν™œμš©ν•˜μ—¬ λ§Œλ“­λ‹ˆλ‹€.


πŸ“™ Today I Learned

νšŒμ› API 섀계

  • 둜그인 : POST /login

    • request: body(id, pwd)

    • response: ${name}λ‹˜ ν™˜μ˜ν•©λ‹ˆλ‹€ β‡’ 메인 νŽ˜μ΄μ§€λ‘œ 이동

  • νšŒμ› κ°€μž… : POST /join

    • request: body(id, pwd, name)

    • response: ${name}λ‹˜ ν™˜μ˜ν•©λ‹ˆλ‹€ β‡’ 둜그인 νŽ˜μ΄μ§€λ‘œ 이동

  • νšŒμ› κ°œλ³„ 쑰회 : GET /users/:id

    • request: URL (id)

    • response: id, name

  • νšŒμ› κ°œλ³„ νƒˆν‡΄ : DELETE /users/:id

    • request: URL (id)

    • response: ${name}λ‹˜ λ‹€μŒμ— 또 λ΅™κ² μŠ΅λ‹ˆλ‹€. β‡’ 메인 νŽ˜μ΄μ§€λ‘œ 이동



νšŒμ› API μ‹€μŠ΅

Express & Map 객체 μ„€μ •

const express = require('express');
const app = express();
app.listen(7777);
app.use(express.json());

let db = new Map();
let id = 1;

Expressλ₯Ό μ‚¬μš©ν•˜μ—¬ μ„œλ²„λ₯Ό μƒμ„±ν•˜κ³ , Map 객체둜 데이터λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€.


νšŒμ›κ°€μž… POST /join

// νšŒμ› κ°€μž… : POST /join
app.post('/join', (req, res) => {
  const { userId, password, name } = req.body;

  if (userId || password || name) {
    db.set(id++, req.body);
    res.status(201).json({
      message: `${db.get(id - 1).name}λ‹˜ ν™˜μ˜ν•©λ‹ˆλ‹€.`,
    });
  } else {
    res.status(400).json({
      message: `μž…λ ₯ 값을 λ‹€μ‹œ ν™•μΈν•΄μ£Όμ„Έμš”.`,
    });
  }
});

νšŒμ›κ°€μž…μœΌλ‘œ ν•„μˆ˜ μš”μ²­κ°’μ„ ν™•μΈν•œ λ’€, Map 객체에 μ €μž₯ν•œλ’€, "00λ‹˜ ν™˜μ˜ν•©λ‹ˆλ‹€." λ©”μ„Έμ§€λ₯Ό λ³΄λƒ…λ‹ˆλ‹€.

πŸš€ 포슀트맨 κ²°κ³Ό

βœ… 200 OK

❌ 400 Bad Request



둜그인 POST

// 둜그인 : POST /login
app.post('/login', (req, res) => {
  const { userId, password } = req.body;

  if (!userId || !password) {
    return res.status(400).json({ message: 'μž…λ ₯ 값을 λ‹€μ‹œ ν™•μΈν•΄μ£Όμ„Έμš”.' });
  }

  let foundUser;

  for (const id of db.keys()) {
    const user = db.get(id);
    if (user.userId === userId) {
      foundUser = user;
      break;
    }
  }

  if (!foundUser) {
    return res.status(404).json({ message: 'μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” μ‚¬μš©μžμž…λ‹ˆλ‹€.' });
  }

  if (foundUser.password !== password) {
    return res.status(401).json({ message: 'λΉ„λ°€λ²ˆν˜Έκ°€ ν‹€λ ΈμŠ΅λ‹ˆλ‹€.' });
  }

  res.status(200).json({ message: `${foundUser.name}λ‹˜ ν™˜μ˜ν•©λ‹ˆλ‹€.` });
});

Map 객체λ₯Ό μˆœνšŒν•˜μ—¬ μž…λ ₯된 userIdκ°€ μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•˜κ³ , λΉ„λ°€λ²ˆν˜Έκ°€ μΌμΉ˜ν•˜λŠ” 경우 둜그인 성곡 λ©”μ„Έμ§€ "00λ‹˜ ν™˜μ˜ν•©λ‹ˆλ‹€" λ₯Ό λ³΄λƒ…λ‹ˆλ‹€.

πŸš€ 포슀트맨 κ²°κ³Ό

βœ… 200 OK

❌ 401 Unauthorized

❌ 404 Not Found



νšŒμ› κ°œλ³„ 쑰회 GET

// νšŒμ› κ°œλ³„ 쑰회 : GET /users/:id
app.get('/users/:id', (req, res) => {
  const id = parseInt(req.params.id);

  const user = db.get(id);
  if (!user) {
    res.status(404).json({
      message: `μ‘΄μž¬ν•˜λŠ” νšŒμ›μ΄ μ—†μŠ΅λ‹ˆλ‹€.`,
    });
  } else {
    res.status(200).json({
      userId: user.userId,
      name: user.name,
    });
  }
});

params μ—μ„œ 받은 idλ₯Ό Mapμ—μ„œ μ‘°νšŒν•˜μ—¬ μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•œ ν›„ userId와 name을 λ³΄λƒ…λ‹ˆλ‹€.


πŸš€ 포슀트맨 κ²°κ³Ό

βœ… 200 OK

❌ 404 Not Found



νšŒμ› κ°œλ³„ νƒˆν‡΄ DELETE

// νšŒμ› κ°œλ³„ νƒˆν‡΄ : DELETE /users/:id
app.delete('/users/:id', (req, res) => {
  const id = parseInt(req.params.id);

  const user = db.get(id);
  if (!user) {
    res.status(404).json({
      message: `μ‘΄μž¬ν•˜λŠ” νšŒμ›μ΄ μ—†μŠ΅λ‹ˆλ‹€.`,
    });
  } else {
    db.delete(id);
    res.status(200).json({
      message: `${user.name}λ‹˜ λ‹€μŒμ— 또 λ΅™κ² μŠ΅λ‹ˆλ‹€.`,
    });
  }
});

νšŒμ›μ΄ μ‘΄μž¬ν•˜λŠ” 경우 Mapμ—μ„œ 데이터λ₯Ό μ‚­μ œν•˜κ³ , "00λ‹˜ λ‹€μŒμ— 또 λ΅™κ² μŠ΅λ‹ˆλ‹€" λ©”μ„Έμ§€λ₯Ό λ³΄λƒ…λ‹ˆλ‹€.


πŸš€ 포슀트맨 κ²°κ³Ό

βœ… 200 OK

❌ 404 Not Found




✏️ ν•œ 쀄 회고

HTTP μƒνƒœ μ½”λ“œλ₯Ό ν™œμš©ν•˜μ—¬ νšŒμ› APIλ₯Ό λ§Œλ“€λ©΄μ„œ νŽ˜μ΄μ§€μ— ν•„μš”ν•œ 데이터 ꡬ쑰λ₯Ό κ³ λ―Όν•΄λ³Ό 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

profile
🌱개발 기둝μž₯

0개의 λŒ“κΈ€