코드/JavaScript

RESTful API란?

juundev 2024. 6. 20. 16:20
RESTful APIREST(Representational State Transfer) 아키텍처 스타일을 따르는 API를 의미한다.
REST는 웹 서비스 디자인을 위한 아키텍처 원칙 및 패턴으로, 클라이언트와 서버 간의 상호 작용을 구조화된 방식으로 정의한다.
RESTful APIHTTP를 통해 데이터를 전송하며, 다음과 같은 특성을 가진다.

 

REST의 핵심 개념

  1. 자원(Resource)
    • 모든 것자원으로 표현된다.
    • 자원URI(Uniform Resource Identifier)로 식별된다.
    • 예: '/users', '/posts/1'
  2. HTTP 메서드
    • 자원에 대한 동작은 HTTP 메서드(GET, POST, PUT, DELETE 등)를 사용하여 정의된다.
    • 'GET': 자원의 조회
    • 'POST': 자원의 생성
    • 'PUT': 자원의 갱신
    • 'DELETE': 자원의 삭제
  3. 무상태성(Statelessness)
    • 서버는 각 요청을 독립적으로 처리하며, 요청 간의 상태를 유지하지 않는다.
    • 클라이언트는 모든 필요한 정보를 요청에 포함시켜야 한다.
  4. 표현(Representation)
    • 클라이언트는 자원에 대한 요청을 할 때, 서버는 자원의 현재 상태를 표현하는 데이터를 클라이언트에게 보낸다.
    • 일반적으로 JSON 형식이 사용된다.
  5. 인터페이스의 일관성(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