REST는 자원(Resource)을 기반으로 데이터를 처리하는 방식입니다.
자원은 웹의 URL로 표현되고 HTTP 메서드를 사용해 자원에 접근하거나 조작합니다.
예를 들어, 블로그 게시물을 데이터베이스에서 불러오거나 수정할 때
RESTful API를 사용하면 다음과 같은 방식으로 접근합니다.
RESTful API는 HTTP 메서드를 사용해 자원을 조작합니다.
| HTTP 메서드 | 설명 | 사용 예시 |
|---|---|---|
| GET | 자원 조회 | 게시물 목록 가져오기 |
| POST | 자원 생성 | 새 게시물 작성 |
| PUT | 자원 전체 수정 | 게시물 내용 수정 |
| PATCH | 자원 일부 수정 | 게시물 제목 수정 |
| DELETE | 자원 삭제 | 게시물 삭제 |
블로그에서 게시물을 다루는 RESTful API를 생각해 보겠습니다.
GET /posts : 모든 게시물 목록 가져오기POST /posts : 새 게시물 작성GET /posts/1 : ID가 1인 게시물 가져오기PUT /posts/1 : ID가 1인 게시물 전체 수정DELETE /posts/1 : ID가 1인 게시물 삭제모든 데이터는 자원으로 취급되며, URL을 통해 고유하게 식별됩니다.
예시 : /users, /orders/123
GET, POST, PUT, PATCH, DELETE 등을 사용해 자원에 접근합니다.
서버는 요청의 결과를 HTTP 상태 코드로 응답합니다.
200 OK : 요청 성공
201 Created : 자원 생성 성공
404 Not Found : 요청한 자원이 없음
500 Internal Server Error : 서버 오류 발생
서버는 자원의 상태를 JSON이나 XML 형식으로 응답합니다.
Node.js와 Express로 간단한 RESTful API를 구현한 예시입니다.
GET 모든 게시물 가져오기
app.get('/posts', (req, res) => {
res.json(posts);
});
POST 새 게시물 생성
app.post('/posts', (req, res) => {
const newPost = { id: posts.length + 1, ...req.body };
posts.push(newPost);
res.status(201).json(newPost);
});
GET ID로 특정 게시물 조회
app.get('/posts/:id', (req, res) => {
const post = posts.find(p => p.id === parseInt(req.params.id));
post ? res.json(post) : res.status(404).send('Post not found');
});
PUT ID로 특정 게시물 전체 수정
app.put('/posts/:id', (req, res) => {
const index = posts.findIndex(p => p.id === parseInt(req.params.id));
if (index !== -1) {
posts[index] = { id: parseInt(req.params.id), ...req.body };
res.json(posts[index]);
} else {
res.status(404).send('Post not found');
}
});
DELETE ID로 특정 게시물 삭제
app.delete('/posts/:id', (req, res) => {
posts = posts.filter(p => p.id !== parseInt(req.params.id));
res.status(204).send();
});
단순한 설계 : URL과 HTTP 메서드를 사용하여 직관적인 설계를 제공합니다.
언어와 플랫폼 독립적 : 클라이언트와 서버는 서로 다른 기술 스택을 사용할 수 있습니다.
확장성 : RESTful API는 클라이언트와 서버의 변경이 독립적이라 유지보수에 유리합니다.
복잡한 요청 처리 : *무상태 특성으로 인해 클라이언트가 모든 요청에 인증 정보를 포함해야 합니다.
실시간 통신에 부적합 : REST는 웹소켓 같은 실시간 통신에 적합하지 않습니다.
*무상태 : 각 요청이 독립적으로 처리된다는 것을 의미. 서버는 클라이언트의 이전 요청이나 상태를 저장하지 않고 매번 새로운 요청처럼 처리