[Tech | CS] REST API 이해하기

박송이·2021년 8월 21일
0
post-thumbnail

REST? 👀

REST란, Representational State Transfer의 약자다.
HTTP를 기반으로 클라이언트가 서버의 리소스에 접근하는 방식을 규정한 아키텍처다. 다시 말하면, 서버에 있는 자원을 URI로 표시하고 HTTP Method를 이용해 해당 자원의 상태를 주고 받는 것을 의미한다.

REST의 구성요소 ⚡

REST는 자원 , 행위, 표현 이 3가지 요소로 구성됩니다.
자원 서버는 유일한 ID를 가지는 자원을 가지고 있으며, 클라이언트는 이러한 자원에 요청을 보냅니다. URI의 말단에 표현됩니다. (ex: https://kdt.roto.codes/"todos")
행위 자원에 대한 행위를 의미합니다. HTTP Method 라고 부르며 종류는 GET, POST, PUT, PATCH, DELETE등이 있습니다.

HTTP 요청 메소드목적
GET모든/특정 리소스 취득
POST리소스 생성
PUT리소스의 전체 교체
PATCH리소스의 일부 수정
DELETE모든/특정 리소스 삭제

사용 방법 (w. kdt)

const xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.send();

표현 자원에 대한 행위의 구체적 내용을 의미합니다. 위 링크에 "todos"가 json형식의 데이터로 응답 받아온 것을 예로 들 수 있습니다.

REST의 특징 🦾

  1. Uniform Interface (일관된 인터페이스)
    Uniform Interface란, 자원에 대한 요청을 통일적으로 수행하는 아키텍처 스타일을 말합니다. 이는 클라이언트의 플랫폼(android, ios, jsp)에 무관해 특정 언어나 기술에 종속받지 않는 특징을 의미합니다.
  2. Stateless (무상태성)
    REST는 각각의 요청을 별개로 인식하고 처리하며, 이전 요청이 다음 요청과 연관되지 않아야합니다. 그렇기때문에 세션정보나 쿠키정보를 활용해 상태정보를 저장 및 관리하지 않습니다. (서버는 클라이언트의 상태 (쿠키, 세선)등을 신경쓰지 않는다.)
  3. Cacheable (캐시가능)
    HTTP 웹 표준을 사용하기 때문에, 캐싱 기능을 적용할 수 있습니다. (대량의 요청을 빠르게 처리할 수 있게 됩니다.)
  4. Client-Server Architecture (서버-클라이언트 구조)
    서버는 API를 제공하고 클라이언트는 사용자 인증에 관련된 일들을 관리합니다. 요청은 클라이언트만, 응답은 서버만 하기때문에 서로 의존성이 줄어듭니다.
  5. Self-Descriptiveness (자체 표현)
    REST 요청/응답 메세지는 쉽게 이해할 수 있습니다.
HTTP POST , http://localhost:8080/board
{
	"board":
    		{
        	"title":"제목",
		"content":"내용"
		}
}
  1. Layed System (계층화)
    REST의 서버는 다중 계층으로 구성될 수 있으며, 보안, 로드 밸런싱, 암호화 등을 위한 계층을 추가해여 구조를 변경할 수 있다.

REST API / RESTful ? 👻

REST 기반의 규칙들을 잘 지켜서 설계된 API를 REST API 또는 RESTful로 부른다.

REST API의 특징 ✨

  • 사내 시스템도 REST기반으로 시스템을 분산해 확장성과 재사용성을 높여 유지보수 및 운용을 편리하게 할 수 있다.
  • HTTP 표준을 기반으로 구현하기 때문에, HTTP를 지원하는 프로그래밍 언어로 클라이언트, 서버를 구현할 수 있다. (델파이, 자바, C#등)

REST API 설계 규칙 🌈

  1. URI는 정보의 자원을 표현해야한다.
    URI에는 자원의 동사보다 명사를 사용한다. 또한 행위에 대한 표현은 하지 않는다.
GET/todos/1 => Good👍
POST/student/phoneNumber => Good👍

GET/getTodos/2 => Nope💦
DELETE/deleteName/1 => Nope💦
  1. 자원에 대한 행위는 HTTP Method로 표현한다.
  2. 계층 관계는 / 를 이용해 나타낸다.
http://kdt/frontend/b/names
  1. URI 마지막은 / 를 사용하면 안된다.
  2. 하이픈(-)은 가독성을 높이는데 사용한다.
  3. 언더바(_) 혹은 밑줄은 사용하지 않는다.
  4. URI 경로에는 소문자가 적합하다.
  5. 파일 확장자는 URI에 포함하지 않는다.
    메세지 바디 내용의 포맷을 나타내기 위한 파일 확장자를 URI안에 포함시키지않는다.
http://kdt/frontend.html => Node💦

REST 응답 코드 🌹

2xx 성공

200: 클라이언트의 요청을 정상적으로 수행함
201: 클라이언트에게 생성 작업을 요청 받았고, 생성 작업을 성공함
204: 요청은 성공 했지만 응답할 콘텐츠가 없음

3xx 리다이렉트

301: 클라이언트가 요청한 리소스에 대한 URI가 영구적으로 변경되었을 때 사용함
302: 301과 같으나 임시적으로 주소가 바뀌었을 경우 사용함
304: 이전에 방문했을 때의 요청 결과와 다르지 않을 경우 사용함. 캐시된 페이지를 그대로 사용
307: 임시 페이지로 리다이렉트

4xx 클라이언트 오류

400: 클라이언트가 올바르지 못한 요청을 보냄
401: 로그인을 하지 않아 페이지를 열 권한이 없음
403: 금지된 페이지, 로그인을 하든 안하든 접근할 수 없음
404: 찾을 수 없는 페이지, 주소를 잘 못 입력했을 때 사용함
408: 요청 시간이 초과됨
409: 서버가 요청을 처리하는 과정에서 충돌이 발생한 경우
410: 영구적으로 사용할 수 없는 페이지

5xx 서버 오류

501: 해당 요청을 처리하는 기능이 만들어지지 않음
502: 서버로 가능 요청이 중간에서 유실된 경우
503: 서버가 터졌거나 유지 보수 중
504: 서버 게이트웨이에 문제가 생겨 시간 초과가 된 경우
505: HTTP 버전이 달라 요청이 처리할 수 없음

reference 🍑

0개의 댓글