처음부터 차근차근

[REST API] REST API란? 본문

CS/HTTP

[REST API] REST API란?

HangJu_95 2023. 10. 20. 01:19
728x90

REST API란?

REST API는 REST(Representational State Transfer) 아키텍처 스타일의 디자인 원칙을 준수하는 API이다. 이러한 이유로 REST API를 RESTful API라고도 한다.

 

RESTful한 API를 말하며, 일련의 특징과 규칙 등을 지키는 API를 일컫는다. 2000년에 로이 필딩이 작성한 논문에서 처음으로 작성한 개념이다.

REST란?

Representation State Transfer의 약자

자원을 이름(자원의 표현)으로 구분하여 해당 자원의 상태(정보)를 주고 받는 모든 것을 의미 한다.

즉, 자원(resource)의 표현(representation)에 의한 상태(State) 전달(Transfer)

 

이해 하기 어려우니 하나씩 듣어보자.

 

1. 자원의 표현

  • 자원 : 해당 소프트웨어가 관리하는 모든 것 Ex) 문서, 그림, 이미지, 데이터, 해당 소프트웨어 자체 등등
  • 자원의 표현 : 그 자원을 표현하기 위한 이름 Ex) DB의 학생 정보가 자원일 때, 'Students'를 자원의 표현으로 정한다.

2. 상태(정보) 전달

  • 데이터가 요청되어지는 시점에서 자원의 상태(정보)를 전달한다.
  • JSON 혹은 XML를 통해 데이터를 주고 받는 것이 일반적이다.

월드 와이드 웹(www)과 같은 분산 하이퍼미디어 시스템을 위한 소프트웨어 개발 아키텍처의 한 형식

  • REST는 기본적으로 웹의 기존 기술과 HTTP을 그대로 활용하기 때문에 웹의 장점을 최대한 활용할 수 있는 아키텍처 Style이다.
  • REST는 네트워크 상에서 Client와 Server 사이의 통신 방식 중 하나다.

REST의 구체적 개념

HTTP URL을 통해 자원을 명시하고, HTTP Method)를 통해 해당 자원에 대한 CRUD를 적용하는 것을 의미한다. 즉, 자원 기반의 구조(ROA, Resource Oriented Architecture) 설계의 중심에 Resource가 있고, HTTP Method를 통해 Resource를 처리하도록 설계된 아키텍처를 의미한다.

 

웹 사이트의 이미지, 텍스트, DB 내용 등의 모든 자원에 고유한 ID인 HTTP URL를 부여한다.

CRUD Operation으로는

  • Create : 생성(POST)
  • Read : 조회(GET)
  • Update : 수정(PUT)
  • Delete : 삭제(DELETE)
  • HEAD : header 정보 조회(HEAD)

REST의 특징

1. Uniform-Interface

URL로 지정한 자원에 대한 조직이 통일되고 한정적인 인터페이스로 수행하는 아키텍처 스타일을 말한다.

이렇게 말하니 굉장히 어렵다.

API에서 자원들은 각각의 독립적인 인터페이스를 가지며 각각의 자원들이 URL 자원식별, 표현을 통한 자원조작(Method를 통한), Self-descriptive messages, HATEOAS 구조를 가지는 것을 말한다.

 

여기서 독립적인 인터페이스란 서로 종속적이지 않은 인터페이스를 의미하며, 예를 들어 웹페이지가 변경했다고 웹 브라우저를 업데이트 하는 일은 없어야 하고, HTTP 명세나 HTML 명세가 변경되어도 웹페이지는 잘 동작해야 한다는 것을 의미한다.

 

URL 자원식별

자원(텍스트, 이미지, 동영상 등) 자원은 URL로 식별되어야 한다.

 

표현을 통한 자원조작

manipulation of resources through representations은 URL과 GET, DELETE 등 HTTP 표준메서드 등을 통해 자원을 조회, 삭제 등 작업을 설명할 수 있는 정보가 담겨야 하는 것을 말합니다.

 

Self-descriptive messages

HTTP Header에 타입을 명시하고 각 메시지(자원)들은 MIME types에 맞춰 표현되어야 한다.

MIME type(media type이라고도 한다)는 문서, 파일 드으이 특성과 형식을 나타내는 표준이다.

Ex) font/ttf, text/plain, application/json 등

https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types

 

예를 들어보자. good은 json으로 잘 작성되어있지만, Bad의 경우 text(String)형태이지만, header는 application/json으로 구성되어 있다. 이는 잘못된 표현이다.

const express = require('express')
const app = express()
// 잘 작성된 타입
app.get('/good',(req, res) =>{
	res.status(200).json({"a" : 1})
})
// 잘 작성되지 않은 타입
app.get('/bad',(req, res) =>{
	res.setHeader('content-type', 'application/json');
	res.send("큰돌이")
})
const server = app.listen(12010, () =>{
	console.log("오늘도 재밌는 CS공부서버 ~ : http://127.0.0.1:12010/good")
})

 

HATEOAS 구조

HATEOAS(Hypermedia as the Engine of Application State)는 하이퍼링크에 따라 다른 페이지를 보여줘야 하며, 데이터마다 어떤 URL에서 원했는지 명시해주어야 하는 것을 의미한다.

보통은 href, links, link, url 속성 중 하나에 해당 데이터의 URL을 담아서 표기해야 한다.

 

예시를 들어보자.

ex1) 동적으로 링크를 만들며 href 속성을 통해 설정

const express = require('express');
const app = express();
const books = [
	{ id: 1, title: '자바스크립트 풀스택 MEVN', author: '큰돌1'},
	{ id: 2, title: 'CS지식노트', author: '큰돌2'},
	{ id: 3, title: '자바스크립트 어나더레벨', author: '큰돌3'},
];
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(404).json({ error: 'Book not found' });
	}
});
app.listen(12010, () => {
	console.log('큰돌이의 책서버 시작 :
http://127.0.0.1:12010/books');
});

여기서 rel은 relation으로 링크와 요청한 자원과의 관계를 나타낸다.

self : 해당 자원에 대한 링크

만약 상세한 내용을 보여준다면 detail, 책을 사는 정보를 담고 있다면 buyBook이 들어갈 수 있다.

 

ex2) link 속성을 기반으로 설정

데이터 하나 당 link 한개가 아니라 데이터 여러개 당 link 한개로 걸 수 있다.

{"link":http://kundol.net/todos/{id}, "data":[{...}]}

ex3) 실제 github에서 제공하는 REST API, url 속성을 기반으로 설정

https://docs.github.com/ko/rest/issues/milestones?apiVersion=2022-11-28

2. Stateless(무상태성)

REST는 무상태성 성격을 갖습니다. 이는 작업을 위한 상태정보를 따로 저장하고 관리하지 않는다. HTTP 자체가 Stateless이기 떄문에 HTTP를 이용하는 것만으로도 만족한다.

그리고 이는 REST API를 제공해주는 서버는 세션(session)을 해당 서버 쪽에 유지하지 않는다는 의미이다. 즉 세션 정보나 쿠키 정보를 별도로 저장하고 관리하지 않기 때문에 API 서버는 들어오는 요청만을 단순히 처리하면 된다.

이를 통해 서비스의 자유도가 높아지고 서버에서 불필요한 정보를 관리하지 않음으로써 구성이 단순해진다.

3. Cacheable

REST의 가장 큰 특징 중 하나는 HTTP를 사용하는 것이다. HTTP는 원래 캐싱이 자동으로 되는 기능이 있다.

(새로고침을 하면 304가 뜨면서 원래 있던 js와 CSS이미지 등을 불러오는 것을 볼 수 있다. 이는 GET에 한정되어 있으며,

'Cache-Control:max-age=100‘(100초)이런 식으로 한정된 시간을 정할 수가 있으며 캐싱된 데이터가 유효한지를 판단하기 위해

'Last-modified'와 'Etag’라는 헤더값을 씁니다. 'Etag'는 전달되는 값에 태그를 붙여서캐싱되는 자원인지를 확인해주는 것이다.)

4. Client-Server 구조

REST 서버는 API 제공, 클라이언트는 사용자 인증이나 context(세션, 로그인 정보)등을 직접 관리하는 구조로 각각의 역할이 확실히 구분되기 때문에 클라이언트와 서버에서 개발해야 할 내용이 명확해지고, 서로간의 독립적인 구조를 가질 수 있다.

5. 계층형 구조

REST 서버는 다중 계층으로 구성될 수 있으며 보안, 로드 밸런싱, 암호화 계층을 추가해 구조상의 유연성을 둘 수 있고 PROXY, 게이트웨이 같은 네트워크 기반의 중간매체를 사용할 수 있게 한다.

REST의 구성

1. 자원(Resource) : URL

모든 자원에 고유한 ID가 존재하고, 이 자원은 Server에 존재한다.

자원을 구별하는 ID는 ‘/groups/:group_id’와 같은 HTTP URL이다.

Client는 URL를 이용해서 자원을 지정하고 해당 자원의 상태(정보)에 대한 조작을 Server에 요청한다.

 

2. 행위(Verb) : HTTP Method

HTTP 프로토콜의 Method를 사용한다.

HTTP 프로토콜은 GET, POST, PUT, DELETE와 같은 메서드를 제공한다.

 

3. 표현(Representation of Resource)

Client가 자원의 상태(정보)에 대한 조작을 요청하면 Server는 이에 적절한 응답(Representation)을 보낸다.

REST에서 하나의 자원은 JSON, XML, TEXT, RSS 등 여러 형태의 Representation으로 나타내어 질 수 있다.

JSON 혹은 XML를 통해 데이터를 주고 받는 것이 일반적이다.

REST API의 URL 규칙

1. 동작은 HTTP 메소드로만 해야 하고 url 에 해당 내용이 들어가면 안됩니다.

수정 = put, 삭제 = delete, 추가 = post, 조회 = get을 이용해야 합니다.

예를 들어 '/books/delete/1' 이렇게 표기하면 안 된다는 것입니다.

2. .jpg, .png 등 확장자는 표시 하지 말아야 합니다.

3. 동사가 아닌 명사로만 표기해야 합니다.

유저가 책을 소유한다라는 것을 표현한다면 '유저/유저아이디/inclusion/책/책아이디' 로 표현하고 유저가 소유한 아파트를 조회한다고 하면 이렇게 표현해야 합니다.

/users/{userid}/aparts 또한 /getAllUsers 식의 동사를 집어넣으면 안됩니다.

4. 계층적인 내용을 담고 있어야 합니다.

'/집/아파트/전세' 이런 식으로 내려가야 합니다.

5. 대문자가 아닌 소문자로만 쓰며 너무 길 경우에 바를 써야 할 경우 언더바_가 아닌 그냥바 -를 씁니다.

6. HTTP 응답 상태코드를 적재적소에 활용합니다.성공시에는 200, 리다이렉트는 301 등…

REST의 장단점

장점

  • HTTP 프로토콜의 인프라를 그대로 사용하므로 REST API 사용을 위한 별도의 인프라를 구출할 필요가 없다.
  • HTTP 프로토콜의 표준을 최대한 활용하여 여러 추가적인 장점을 함께 가져갈 수 있게 해준다.
  • HTTP 표준 프로토콜에 따르는 모든 플랫폼에서 사용이 가능하다.
  • Hypermedia API의 기본을 충실히 지키면서 범용성을 보장한다.
  • REST API 메시지가 의도하는 바를 명확하게 나타내므로 의도하는 바를 쉽게 파악할 수 있다.
  • 여러가지 서비스 디자인에서 생길 수 있는 문제를 최소화한다.
  • 서버와 클라이언트의 역할을 명확하게 분리한다.

단점

  • 표준이 존재하지 않는다.
  • 사용할 수 있는 메소드가 4가지 밖에 없다.HTTP Method 형태가 제한적이다.
  • 브라우저를 통해 테스트할 일이 많은 서비스라면 쉽게 고칠 수 있는 URL보다 Header 값이 왠지 더 어렵게 느껴진다.
  • 구형 브라우저가 아직 제대로 지원해주지 못하는 부분이 존재한다

참조

 

[서버] REST API란? - 하나몬

REST의 개념을 이해한다. REST의 특징을 이해한다. REST API의 개념을 이해한다. REST API의 설계 규칙을 이해한다. RESTful의 개념을 이해한다.

hanamon.kr

 

 

REST API 제대로 알고 사용하기 : NHN Cloud Meetup

REST API 제대로 알고 사용하기

meetup.nhncloud.com

 

 

[Network] REST란? REST API란? RESTful이란? - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

 

 

RESTful API란 무엇인가요? - RESTful API 설명 - AWS

Amazon API Gateway는 어떤 규모에서든 개발자가 API를 손쉽게 생성, 게시, 유지 관리, 모니터링 및 보안 유지할 수 있도록 하는 완전관리형 서비스입니다. API Gateway를 사용하면 실시간 양방향 통신 애

aws.amazon.com

 

'CS > HTTP' 카테고리의 다른 글

[REST API] REST API 설계 원칙  (0) 2023.11.25
[GraphQL] GraphQL이란?  (0) 2023.11.24