[CS] RestfulApi와 JSON (데이터 전송형식)

insung·2024년 6월 26일

CS

목록 보기
4/20

RESTful 이란 무엇인가..

RESTful(Representational State Transfer)은 웹 서비스 설계 원칙, 웹을 통해 데이터를 전송하는 데 사용되는 아키텍처 스타일.

  1. 자원(Resource): RESTful 아키텍처에서 모든 것은 "자원"으로 표현. 일반적으로 웹에서 접근 가능한 모든 것을 나타냄. 예를 들어, 사용자, 제품, 주문, 블로그 게시물 등 모든 것이 자원.
  2. HTTP 메서드: RESTful 아키텍처에서 자원에 대한 작업을 수행하기 위해 HTTP 메서드를 사용.
    일반적으로 사용되는 HTTP 메서드는 다음과 같습니다.
    - GET: 자원을 조회합니다.
    - POST: 새로운 자원을 생성.
    - PUT: 자원을 업데이트하거나 새로운 자원을 생성.
    - DELETE: 자원을 삭제.
  3. 표현(Representation): 자원은 다양한 형식으로 표현될 수 있음. 가장 흔한 형식은 JSON 또는 XML. 클라이언트와 서버 간에 이러한 표현을 교환하여 데이터를 전송.
  4. 상태(Stateless): RESTful 아키텍처는 상태를 관리하지 않는 것을 강조. 각 요청은 모든 필요한 정보를 포함하고 있어야, 서버는 이 정보를 기반으로 요청을 처리. 이로인해 서버는 클라이언트의 상태를 유지할 필요가 없다.
  5. URI(Uniform Resource Identifier): 자원은 고유한 URI를 가지고 있어야. URI는 자원을 식별하는 데 사용되며, 각 자원은 고유한 URI를 가지고 있어야.
RESTful 설계 원칙을 충실히 이행한 예제 코드를 아래에 제시하겠습니다. 
이 예제는 간단한 블로그 게시물 관리 시스템을 가정하고 있습니다.

자원(Resouces): 게시물(posts)은 자원입니다.

HTTP 메서드: 다음과 같이 HTTP 메서드를 사용하여 게시물 관련 작업을 수행합니다.

GET /posts: 모든 게시물 조회
GET /posts/{id}: 특정 ID의 게시물 조회
POST /posts: 새로운 게시물 생성
PUT /posts/{id}: 특정 ID의 게시물 업데이트
DELETE /posts/{id}: 특정 ID의 게시물 삭제

표현(Representation): JSON 형식을 사용하여 게시물 데이터를 표현합니다.

상태(Stateless): 서버는 클라이언트의 상태를 관리하지 않으며, 모든 요청은 필요한 정보를 포함해야 합니다.

이제 예제 코드를 보여드리겠습니다. 이 코드는 Node.js와 Express.js를 사용한 간단한 서버 코드입니다.

const express = require('express');
const bodyParser = require('body-parser');

const app = express();
const PORT = 3000;

// 미들웨어 설정
app.use(bodyParser.json());

// 블로그 게시물 데이터
let posts = [
  { id: 1, title: '첫 번째 게시물', content: '안녕하세요. 첫 번째 게시물입니다.' },
  { id: 2, title: '두 번째 게시물', content: '안녕하세요. 두 번째 게시물입니다.' },
];

// 모든 게시물 조회
app.get('/posts', (req, res) => {
  res.json(posts);
});

// 특정 ID의 게시물 조회
app.get('/posts/:id', (req, res) => {
  const id = parseInt(req.params.id);
  const post = posts.find(post => post.id === id);

  if (!post) {
    res.status(404).json({ error: '게시물을 찾을 수 없습니다.' });
  } else {
    res.json(post);
  }
});

// 새로운 게시물 생성
app.post('/posts', (req, res) => {
  const newPost = req.body;
  newPost.id = Date.now(); // 임시로 생성한 ID를 사용
  posts.push(newPost);
  res.status(201).json(newPost);
});

// 특정 ID의 게시물 업데이트
app.put('/posts/:id', (req, res) => {
  const id = parseInt(req.params.id);
  const updatedPost = req.body;
  const index = posts.findIndex(post => post.id === id);

  if (index === -1) {
    res.status(404).json({ error: '게시물을 찾을 수 없습니다.' });
  } else {
    posts[index] = { ...posts[index], ...updatedPost };
    res.json(posts[index]);
  }
});

// 특정 ID의 게시물 삭제
app.delete('/posts/:id', (req, res) => {
  const id = parseInt(req.params.id);
  const index = posts.findIndex(post => post.id === id);

  if (index === -1) {
    res.status(404).json({ error: '게시물을 찾을 수 없습니다.' });
  } else {
    posts.splice(index, 1);
    res.sendStatus(204); // No Content
  }
});

app.listen(PORT, () => {
  console.log(`서버가 포트 ${PORT}에서 실행 중입니다.`);
});

Data의 전송 형식

  • CSV
    • 각 항목을 쉼표로 구분해 데이터를 표현
    • 굉장히 짧고, 많은 양의 데이터 전송시 유리
    • 하지만 데이터 내용 파악이 어렵다
  • XML
    • tag로 데이터를 표현
    • tag를 통해 각 data가 무엇을 의미하는지 파악 가능
    • tag에 사용자 정의 속성을 넣을 수 있어 복잡한 data도 전달 가능
  • JSON
    • CSV와 XML의 단점을 극복한 형식
    • JS에서 사용하는 객체의 형식으로 데이터를 표현 (키 : 값)
    • Ajax 사용시 표준이라 볼 수 있다.
💡 JSON의 특징
  • 데이터를 주고 받을 때 가장 간단한 파일 포맷
  • 텍스트 기반으로 읽기 편함
  • Key : value의 쌍
  • 서버와 데이터 통신시 직렬화, 역직렬화 사용
    • 직렬화 → 객체를 문자열로 (JSON.stringify(객체))
    • 역직렬화 → 문자열을 객체로 변환 (JSON.parse(문자열))
  • 플랫폼 상관없이 사용가능
profile
안녕하세요 프론트엔드 관련 포스팅을 주로 하고 있습니다

0개의 댓글