RESTful API는 REST(Representational State Transfer) 아키텍처 스타일을 따르는 API를 의미한다.
REST는 웹 서비스 디자인을 위한 아키텍처 원칙 및 패턴으로, 클라이언트와 서버 간의 상호 작용을 구조화된 방식으로 정의한다.
RESTful API는 HTTP를 통해 데이터를 전송하며, 다음과 같은 특성을 가진다.
REST의 핵심 개념
- 자원(Resource)
- 모든 것은 자원으로 표현된다.
- 자원은 URI(Uniform Resource Identifier)로 식별된다.
- 예: '/users', '/posts/1'
- HTTP 메서드
- 자원에 대한 동작은 HTTP 메서드(GET, POST, PUT, DELETE 등)를 사용하여 정의된다.
- 'GET': 자원의 조회
- 'POST': 자원의 생성
- 'PUT': 자원의 갱신
- 'DELETE': 자원의 삭제
- 무상태성(Statelessness)
- 서버는 각 요청을 독립적으로 처리하며, 요청 간의 상태를 유지하지 않는다.
- 클라이언트는 모든 필요한 정보를 요청에 포함시켜야 한다.
- 표현(Representation)
- 클라이언트는 자원에 대한 요청을 할 때, 서버는 자원의 현재 상태를 표현하는 데이터를 클라이언트에게 보낸다.
- 일반적으로 JSON 형식이 사용된다.
- 인터페이스의 일관성(Uniform Interface)
- RESTful API는 일관된 인터페이스를 제공하여 단순성과 일관성을 유지한다.
RESTful API의 예
아래는 간단한 블로그 API의 예이다. 이 API는 블로그 포스트와 사용자 정보를 관리한다.
자원
- '/posts': 블로그 포스트
- '/users': 사용자
HTTP 메서드와 자원
- GET /posts: 모든 블로그 포스트를 가져온다.
- GET /posts/1: ID가 1인 특정 블로그 포스트를 가져온다.
- POST /posts: 새로운 블로그 포스트를 생성한다.
- 요청 본문 예: '{ "title": "새 블로그 포스트", "content": "내용" }'
- PUT /posts/1: ID가 1인 블로그 포스트를 업데이트한다.
- 요청 본문 예: '{ "title": "업데이트된 제목", "content": "업데이트된 내용" }'
- DELETE /posts/1: ID가 1인 블로그 포스트를 삭제한다.
RESTful API의 장점
- 확장성: 클라이언트와 서버가 독립적으로 확장될 수 있다.
- 유연성: REST는 표준 HTTP를 사용하므로 다양한 클라이언트와 쉽게 상호 작용할 수 있다.
- 일관성: 일관된 인터페이스를 제공한다.
RESTful API의 단점
- 복잡성: 매우 복잡한 트랜잭션에는 적합하지 않을 수 있다.
- 무상태성: 무상태성 때문에 클라이언트가 매번 모든 데이터를 보내야 하므로, 네트워크 트래픽이 증가할 수 있다.
예제 코드
아래는 Node.js와 Express를 사용하여 간단한 RESTful API를 구현한 예제이다.
const express = require('express');
const app = express();
const port = 3000;
app.use(express.json());
let posts = [
{ id: 1, title: '첫 번째 포스트', content: '내용 1' },
{ id: 2, title: '두 번째 포스트', content: '내용 2' }
];
// GET /posts
app.get('/posts', (req, res) => {
res.json(posts);
});
// GET /posts/:id
app.get('/posts/:id', (req, res) => {
const post = posts.find(p => p.id === parseInt(req.params.id));
if (!post) return res.status(404).send('포스트를 찾을 수 없습니다.');
res.json(post);
});
// POST /posts
app.post('/posts', (req, res) => {
const post = {
id: posts.length + 1,
title: req.body.title,
content: req.body.content
};
posts.push(post);
res.status(201).json(post);
});
// PUT /posts/:id
app.put('/posts/:id', (req, res) => {
const post = posts.find(p => p.id === parseInt(req.params.id));
if (!post) return res.status(404).send('포스트를 찾을 수 없습니다.');
post.title = req.body.title;
post.content = req.body.content;
res.json(post);
});
// DELETE /posts/:id
app.delete('/posts/:id', (req, res) => {
const postIndex = posts.findIndex(p => p.id === parseInt(req.params.id));
if (postIndex === -1) return res.status(404).send('포스트를 찾을 수 없습니다.');
posts.splice(postIndex, 1);
res.status(204).send();
});
app.listen(port, () => {
console.log(`서버가 http://localhost:${port}에서 실행 중입니다.`);
});
이 예제에서는 간단한 블로그 API를 정의하고, 각 자원에 대해 CRUD(Create, Read, Update, Delete) 동작을 구현했다.
'코드 > JavaScript' 카테고리의 다른 글
var, let, const 차이점과 일시적 사각지대(TDZ) (0) | 2024.10.15 |
---|---|
실행컨텍스트와 호이스팅 (0) | 2024.10.15 |
Promise와 Async (0) | 2024.06.20 |
화살표 함수와 일반 함수의 차이점 (0) | 2024.06.19 |
호이스팅과 스코프 (0) | 2024.06.19 |