
1. REST API란?
REST API(Representational State Transfer API)는 HTTP 프로토콜을 기반으로 클라이언트와 서버가 데이터를 주고받는 방식을 의미한다. REST는 웹의 아키텍처 스타일 중 하나로, 리소스(Resource) 중심으로 설계되어 있으며 간결하고 직관적인 URL과 HTTP 메서드를 활용하는 것이 특징이다.
📌 REST API의 주요 개념
- 리소스(Resource) → URI(Uniform Resource Identifier)로 표현됨 (/users, /posts/1 등)
- 행동(Method) → HTTP 메서드(GET, POST, PUT, DELETE 등) 사용
- 표현(Representation) → JSON, XML 등의 형식으로 데이터를 주고받음
📌 REST API의 주요 특징
- 클라이언트-서버 구조 → 클라이언트와 서버를 분리하여 확장성 증가
- 무상태성(Stateless) → 각 요청이 독립적으로 처리되며, 서버가 클라이언트의 상태를 저장하지 않음
- 캐싱 가능(Cacheable) → GET 요청 응답을 캐싱하여 성능 최적화 가능
- 계층적 구조(Layered System) → API가 프록시, 로드 밸런서를 통해 계층적으로 설계될 수 있음
- 일관된 인터페이스(Uniform Interface) → URL, HTTP 메서드를 일관되게 사용하여 가독성 향상
2. RESTful API란?
RESTful API란 REST의 원칙을 잘 따르는 API를 의미한다. 즉, 리소스를 명확하게 구분하고, HTTP 메서드를 적절하게 활용하며, 일관된 응답 구조를 유지하는 API가 RESTful한 API라고 할 수 있다.
📌 RESTful한 API의 조건
- 명확한 리소스 경로 사용 (/users/1 → 특정 사용자 조회)
- HTTP 메서드의 적절한 활용 (GET, POST, PUT, DELETE 등)
- 응답 데이터 형식 통일 (JSON, XML)
- URI에 동사를 사용하지 않음 (예: /getUser ❌ → /users ⭕)
📌 RESTful하지 않은 예제
❌ GET /getUser?id=1
❌ POST /createUser
❌ PUT /modifyUser/1
❌ DELETE /removeUser/1
📌 RESTful한 예제
✅ GET /users/1 → 특정 사용자 조회
✅ POST /users → 사용자 생성
✅ PUT /users/1 → 특정 사용자 정보 수정
✅ DELETE /users/1 → 특정 사용자 삭제
3. REST API의 HTTP 메서드
REST API는 HTTP 메서드를 활용하여 리소스의 상태를 조작한다.
| HTTP 메서드 |
역할 |
| GET | 리소스 조회 |
| POST | 리소스 생성 |
| PUT | 리소스 전체 수정 |
| PATCH | 리소스 일부 수정 |
| DELETE | 리소스 삭제 |
📌 HTTP 메서드 예제
GET /products → 전체 상품 목록 조회
GET /products/1 → 특정 상품 조회
POST /products → 새로운 상품 생성
PUT /products/1 → 특정 상품 정보 수정
DELETE /products/1 → 특정 상품 삭제
📌 PUT과 PATCH의 차이점
- PUT: 리소스의 전체 내용을 수정
- PATCH: 리소스의 일부 내용을 수정
예를 들어, 사용자의 email 정보만 수정할 경우 PATCH를 사용한다.
4. REST API 응답 코드
REST API는 HTTP 응답 코드를 활용하여 클라이언트에게 요청 처리 결과를 전달한다.
| 상태 코드 |
의미 |
| 200 OK | 요청 성공 (데이터 조회, 수정 완료) |
| 201 Created | 리소스 생성 성공 |
| 204 No Content | 요청 성공했지만 응답 본문 없음 (DELETE 요청) |
| 400 Bad Request | 잘못된 요청 (필수 파라미터 누락 등) |
| 401 Unauthorized | 인증 실패 (로그인 필요) |
| 403 Forbidden | 권한 없음 |
| 404 Not Found | 요청한 리소스를 찾을 수 없음 |
| 500 Internal Server Error | 서버 내부 오류 |
📌 예제 응답 (JSON)
{
"status": 200,
"message": "Success",
"data": {
"id": 1,
"name": "iPhone 15",
"price": 1200000
}
}
5. RESTful API 설계 원칙
RESTful한 API를 설계할 때는 다음 원칙을 따르는 것이 중요하다.
1) 명확한 리소스 URI 사용
- URI는 리소스를 나타내야 하며, 동사를 포함하지 않아야 한다.
❌ GET /getUser?id=1
✅ GET /users/1
2) HTTP 메서드의 올바른 사용
- HTTP 메서드와 URI를 조합하여 리소스를 조작한다.
✅ POST /users → 새 사용자 등록
✅ PUT /users/1 → 사용자 정보 전체 수정
✅ PATCH /users/1 → 사용자 정보 일부 수정
✅ DELETE /users/1 → 사용자 삭제
3) 일관된 응답 구조 유지
- JSON을 기본 응답 포맷으로 사용하고, 응답 데이터의 형식을 통일한다.
{
"status": 200,
"message": "Success",
"data": {
"id": 1,
"name": "Alice",
"email": "alice@example.com"
}
}
4) 에러 응답 처리
- 오류가 발생할 경우 명확한 HTTP 상태 코드와 메시지를 제공한다.
{
"status": 400,
"error": "Bad Request",
"message": "필수 필드 'email'이 누락되었습니다."
}
5) 버전 관리 (Versioning)
- API 변경 시 클라이언트의 혼란을 방지하기 위해 버전 관리를 적용한다.
✅ /api/v1/users
✅ /api/v2/users
6. REST API와 GraphQL 비교
REST API 외에도 GraphQL이라는 대체 기술이 존재한다. 두 방식은 각기 다른 장단점을 가진다.
| 비교 항목 | REST API | GraphQL |
| 데이터 요청 방식 | 여러 개의 엔드포인트 제공 | 하나의 엔드포인트 사용 |
| 데이터 응답 크기 | 필요 없는 데이터 포함 가능 | 클라이언트가 필요한 데이터만 요청 |
| 유연성 | 고정된 응답 구조 | 요청에 따라 응답 구조 변경 가능 |
| 성능 | 여러 요청이 필요할 수 있음 | 한 번의 요청으로 원하는 데이터 수집 |
📌 언제 REST API를 사용하고, 언제 GraphQL을 사용할까?
- REST API: 단순한 CRUD 기능이 필요할 때
- GraphQL: 다양한 데이터를 한 번에 요청해야 할 때
7. REST API 사용 예제
📌 Node.js + Express로 간단한 REST API 만들기
const express = require('express');
const app = express();
app.use(express.json());
let users = [{ id: 1, name: "Alice" }];
// 사용자 목록 조회
app.get('/users', (req, res) => {
res.status(200).json(users);
});
// 새로운 사용자 추가
app.post('/users', (req, res) => {
const newUser = { id: users.length + 1, name: req.body.name };
users.push(newUser);
res.status(201).json(newUser);
});
// 서버 실행
app.listen(3000, () => console.log('Server running on port 3000'));
'컴퓨터공학' 카테고리의 다른 글
| 쿠키(Cookie)와 세션(Session)의 차이점 (0) | 2025.03.18 |
|---|---|
| JWT(JSON Web Token) 인증 방식 개념 (0) | 2025.03.18 |
| 객체지향 프로그래밍(OOP) 개념과 SOLID 원칙 (0) | 2025.03.17 |
| 동적 프로그래밍(Dynamic Programming)의 개념과 예제 (0) | 2025.03.17 |
| 그래프(Graph) 자료구조와 최단 경로 알고리즘 (다익스트라, 플로이드 워셜) (0) | 2025.03.16 |