← 홈페이지 5강 목록으로
🌐
EPISODE 05
자원/행위 · HTTP 메서드 · 상태 코드 · JSON

REST API

REST 아키텍처 원칙(자원·행위·표현), HTTP 메서드별 역할(GET/POST/PUT/PATCH/DELETE), 상태 코드(200/201/400/404/500), express.json()을 익혀 RESTful API를 만듭니다.

RESTAPIHTTP
소요 시간
45~60분
난이도
📊 중급
선수 조건
🎯 node-04
결과물
GET·POST·PUT·DELETE 모두 지원하는 todos API

이 강의에서 배우는 것

  • 1REST URL을 자원(명사 복수형)으로 설계한다
  • 2HTTP 메서드별 역할과 멱등성을 안다
  • 3주요 상태 코드(2xx/4xx/5xx)를 적절히 반환한다
  • 4express.json()으로 POST 바디를 파싱한다
  • 5curl이나 Thunder Client로 API를 테스트한다

1. REST 핵심 개념

개념설명예시
자원(Resource)API가 다루는 데이터할 일, 유저, 상품
행위(Verb)자원에 대한 작업조회, 생성, 수정, 삭제
표현(Representation)데이터 형식JSON

URL 설계 원칙

text
자원은 명사·복수형, 행위는 HTTP 메서드로

GET    /todos       → 할 일 목록
GET    /todos/1     → 특정 할 일
POST   /todos       → 할 일 생성
PUT    /todos/1     → 전체 수정
PATCH  /todos/1     → 일부 수정
DELETE /todos/1     → 삭제

2. HTTP 메서드별 역할

메서드역할멱등성바디
GET조회OX
POST생성XO
PUT전체 수정OO
PATCH일부 수정OO
DELETE삭제OX

3. HTTP 상태 코드

text
2xx 성공
  200 OK              → 요청 성공
  201 Created         → 생성 성공
  204 No Content      → 응답 바디 없음

4xx 클라이언트 오류
  400 Bad Request     → 잘못된 요청
  401 Unauthorized    → 인증 필요
  403 Forbidden       → 권한 없음
  404 Not Found       → 자원 없음

5xx 서버 오류
  500 Internal Server Error
javascript
res.status(201).json({ id: 1, message: '생성 완료' });
res.status(404).json({ error: '항목을 찾을 수 없습니다.' });
res.status(500).json({ error: '서버 오류가 발생했습니다.' });

4. JSON 응답

javascript
res.json({
  success: true,
  data: { id: 1, title: '할 일 1' },
});

res.json([
  { id: 1, title: '할 일 1' },
  { id: 2, title: '할 일 2' },
]);

5. express.json() 미들웨어

javascript
app.use(express.json());

app.post('/todos', (req, res) => {
  const { title, done } = req.body;
  console.log(title, done);
});

6. API 테스트

Thunder Client (VS Code)

VS Code에서 바로 API 테스트 가능.

curl

bash
# GET
curl http://localhost:3000/api/todos

# POST
curl -X POST http://localhost:3000/api/todos \
  -H "Content-Type: application/json" \
  -d '{"title": "Node.js 공부", "done": false}'

# DELETE
curl -X DELETE http://localhost:3000/api/todos/1
예제 코드 / 강의 자료

전체 강의 자료와 예제 코드는 GitHub에서 자유롭게 받아볼 수 있습니다.

GitHub에서 보기 ↗