🔧 REST API 서버 만들기
📖 정의
REST API는 HTTP 프로토콜을 사용하여 클라이언트와 서버가 데이터를 주고받는 웹 서비스 인터페이스입니다. Express.js는 Node.js 기반의 경량 웹 프레임워크로, REST API를 빠르고 쉽게 구축할 수 있 게 해줍니다. CRUD 작업(생성, 조회, 수정, 삭제)을 HTTP 메서드(GET, POST, PUT, DELETE)로 구현합니다.
🎯 비유로 이해하기
레스토랑 시스템
REST API를 레스토랑에 비유하면:
레스토랑 = API 서버
├─ 웨이터 = API 엔드포인트
├─ 메뉴판 = API 문서
├─ 주문서 = HTTP 요청
└─ 요리 = HTTP 응답
손님(클라이언트)의 주문:
GET /menu → 메뉴판 보여주세요 (조회)
POST /orders → 주문할게요 (생성)
GET /orders/123 → 제 주문 어디까지 왔나요? (조회)
PUT /orders/123 → 주문 변경할게요 (수정)
DELETE /orders/123 → 주문 취소할게요 (삭제)
웨이터는 정해진 규칙대로만 응답!
도서관 시스템
도서관 = REST API
├─ 사서 = 서버
├─ 도서 목록 = 데이터베이스
└─ 대출증 = 인증 토큰
REST 원칙:
1. 무상태(Stateless)
└─ 사서는 이전 대화를 기억 안 함
└─ 매번 대출증(토큰)을 보여줘야 함
2. 자원 기반(Resource-based)
└─ /books/123 = 도서 번호 123번
└─ /users/456 = 회원 번호 456번
3. HTTP 메서드로 행동 표현
└─ GET = 책 찾기
└─ POST = 신규 등록
└─ PUT = 정보 수정
└─ DELETE = 폐기
⚙️ 작동 원리
1. HTTP 메서드와 CRUD
CRUD 작업 → HTTP 메서드
CREATE (생성)
└─ POST /api/users
Body: { "name": "김철수", "email": "kim@example.com" }
READ (조회)
├─ GET /api/users (전체 목록)
└─ GET /api/users/123 (특정 항목)
UPDATE (수정)
├─ PUT /api/users/123 (전체 수정)
└─ PATCH /api/users/123 (부분 수정)
Body: { "name": "김영희" }
DELETE (삭제)
└─ DELETE /api/users/123
2. 요청-응답 흐름
클라이언트 서버
| |
| GET /api/users/123 |
|--------------------------->|
| | 1. 라우터 매칭
| | 2. 미들웨어 실행
| | 3. 컨트롤러 로직
| | 4. DB 조회
| | 5. 응답 생성
| |
| 200 OK |
| { id: 123, name: "김철수" }|
|<---------------------------|
| |
3. REST API 설계 규칙
URL 구조:
✅ /api/users (복수형 명사)
✅ /api/users/123 (ID로 특정)
✅ /api/users/123/posts (관계)
❌ /api/getUser (동사 사용 X)
❌ /api/user/delete (동사 사용 X)
HTTP 상태 코드:
200 OK - 성공
201 Created - 생성 성공
204 No Content - 삭제 성공 (본문 없음)
400 Bad Request - 잘못된 요청
401 Unauthorized - 인증 필요
403 Forbidden - 권한 없음
404 Not Found - 찾을 수 없음
500 Internal Server Error - 서버 오류
💡 실제 예시
환경 설정
# 1. Node.js 설치 확인
node --version
npm --version
# 2. 프로젝트 생성
mkdir todo-api
cd todo-api
# 3. package.json 초기화
npm init -y
# 4. 필요한 패키지 설치
npm install express cors dotenv
npm install --save-dev nodemon
# express: 웹 프레임워크
# cors: 크로스 오리진 요청 처리
# dotenv: 환경변수 관리
# nodemon: 자동 재시작 (개발용)
# 5. package.json 수정
cat > package.json << 'EOF'
{
"name": "todo-api",
"version": "1.0.0",
"description": "REST API for Todo App",
"main": "server.js",
"scripts": {
"start": "node server.js",
"dev": "nodemon server.js"
},
"keywords": ["rest", "api", "express", "todo"],
"author": "Your Name",
"license": "MIT",
"dependencies": {
"express": "^4.18.2",
"cors": "^2.8.5",
"dotenv": "^16.3.1"
},
"devDependencies": {
"nodemon": "^3.0.1"
}
}
EOF