네트워크
REST API에 대하여
honey.kikiki
2023. 9. 23. 00:10
728x90
REST API는 웹 개발에서 자주 사용되는 표준화된 방법 중 하나로, 서로 다른 시스템 간 데이터 통신을 위한 규칙과 원칙을 제공합니다. 이를 이해하고 활용하기 위해서는 HTTP 메서드(GET, POST, PUT, DELETE)와 리소스 관리에 대한 이해가 필요합니다. 아래에서 REST API의 기본 개념을 간단히 설명해드리겠습니다.
REST API는 Representational State Transfer API의 약어로, 웹 서비스 간의 통신과 데이터 교환을 위한 아키텍처 스타일 중 하나입니다. RESTful한 API는 일련의 규칙과 원칙을 따르는데, 이러한 규칙은 다음과 같습니다.
- Uniform Interface (일관된 인터페이스):
- 자원을 고유하게 식별하는 데 URL을 사용합니다.
- HTTP 메서드(GET, POST, PUT, DELETE)를 통해 자원을 조작합니다.
- 예를 들어, GET 요청은 자원을 조회할 때, POST 요청은 자원을 생성할 때 사용됩니다.
- 응답은 자원에 대한 표현(Representation)을 포함하며, 이를 통해 자원을 조작할 수 있어야 합니다.
- 자원을 표현하는 데는 MIME 타입(예: application/json)이 사용됩니다.
const express = require('express'); const app = express(); app.get('/good', (req, res) => { res.status(200).json({"a": 1}); }); // 반환되는 정보랑 header정보랑 다르면 안된다. app.get('/bad', (req, res) => { res.setHeader('Content-Type', 'application/json'); res.send("큰돌이") }); const servser = app.listen(12010, () => { console.log('listening on'); }); servser();
- Stateless (무상태성):
- 각 요청은 서버에 대한 어떤 상태도 저장하지 않고, 모든 정보는 요청 자체에 포함되어야 합니다.
- 이는 서버가 각 요청을 독립적으로 처리할 수 있게 합니다.
- Client-Server 구조 (클라이언트-서버 분리):
- 클라이언트와 서버는 서로 독립적으로 개발되어야 하며, 서로에게 영향을 미치지 않아야 합니다.
- 클라이언트는 사용자 인터페이스를 제공하고, 서버는 데이터 및 비즈니스 로직을 관리합니다.
- Layered System (계층 구조):
- 클라이언트와 서버 사이에 여러 개의 계층(예: 로드 밸런서, 캐시 서버)를 둘 수 있습니다.
- 각 계층은 특정 기능을 수행하고, 상위 계층은 하위 계층의 존재를 알지 못합니다.
- Cacheable (캐시 가능):
- 응답 데이터는 캐시될 수 있어야 합니다.
- 클라이언트는 캐시된 데이터를 재사용하여 네트워크 요청을 줄일 수 있습니다.
- HATEOAS (Hypermedia As The Engine Of Application State):
- 응답에는 다음에 취할 수 있는 행동에 대한 링크가 포함되어야 합니다.
- 클라이언트는 이 링크를 통해 어떤 작업을 수행할 수 있습니다.
const express = require('express');
const app = express();
const books = [
{id: 1, title: '알고리즘', author: '성진'},
{id: 2, title: '자바스크립트', author: '성진'},
{id: 3, title: '운영체지', author: '성진'},
]
app.get('/books', (req, res) => {
const bookCollection = books.map(book => ({
...book,
links: [{rel: 'self', href: `/books/${book.id}`}]
}));
res.status(200).json(bookCollection)
});
app.get('/books/:id', (req, res) => {
const bookId = parseInt(req.params.id);
const book = books.find((book) => book.id === bookId);
if (book) {
book.links = [{rel: 'self', href: `/books/${book.id}`}];
res.status(200).json(book);
} else {
res.status(400).json({error: 'Book not Found'});
}
});
여기서 rel은 relation으로 링크와 요청한 자원과의 관계를 나타냅니다. self: 해당 자원에 대한 링크를 나타냅니다. 만약 상세한 내용을 보여준다면 detail, 책을 사는 정보를 담고 있다면 buyBook등이 들어갈 수 있습니다.
REST API는 이러한 원칙을 따라 설계되며, 이를 통해 웹 서비스 간의 표준화된 통신이 가능하게 됩니다. 이를 통해 개발자는 자원을 효과적으로 다루고 클라이언트와 서버 간의 상호 작용을 단순화할 수 있습니다.