COCO World
[CS] REST란 무엇일까, Restful API에 대해 알아보자 본문
🌵 REST란 무엇인가?
■ REST의 의미
REST(Representational State Transfer)의 약자로서 자원을 이름으로 구분하여 해당 자원의 상태(정보)를 주고 받는 모든 것을 의미하는 소프트웨어 프로그램 아키텍처의 한 형식이다.
기술적으로 의미를 파악하자면,
HTTP URI(Uniform Resource Identifier)을 통해 자원(Resource)을 명시하고, HTTP Method(POST, GET, PUT, DELETE, PATCH )을 통해 해당 자원(URI)에 대한 CRUD Operation을 적용하는 것을 의미한다.
CRUD Operation이란?
CRUD는 대부분의 컴퓨터 소프트웨어가 가지는 데이터 처리 기능인 Create(생성), Read(읽기), Update(갱신), Delete(삭제)을 묶어서 일컫는 말로 데이터 생성, 데이터 조회, 데이터 수정, 데이터 삭제를 의미한다.
■ REST 3가지 구성요소
- 자원(Resource) : HTTP URI
- 자원에 대한 행위(Verb) : HTTP Method
- 자원에 대한 행위의 내용(Representations) : HTTP Message Pay Load
■ REST의 특징
1. Server-Client(서버-클라이언트 구조)
: 자원을 저장하고 있는 서버에게 클라이언트는 자원을 요청하는 형태의 구조이다. 서버는 API를 제공하고 비지니스 로직 처리 및 저장을 책임진다.
2. Stateless(무상태)
: 무상태란 클라이언트의 상태(State)를 서버에 저장하지 않는다는 의미이다. HTTP 프로토콜은 기본적으로 무상태인데, REST 역시 HTTP를 기본으로 하기 때문에 무상태이다. 따라서 이전의 요청이 다음의 요청에 연관되지 않으며 이를 통해 서버의 처리 방식에 일관성을 부여하고 부담을 줄여준다.
3. Cacheable(캐리 처리 기능)
: HTTP의 캐싱 기능을 적용할 수 있다. 즉, 대량의 요청을 효율적으로 처리하기 위한 캐시를 사용할 수 있는데 캐시 사용을 통해 응답 속도를 높이고, 성능과 서버의 자원 이용률을 향상시킬 수 있다.
4. Layered System(계층화)
: 클라이언트 입장에서는 바로 끝단의 서버오 연결되어 있는지, 중간의 프록시나 로드 밸런서와 연결되어 작동하는지 알 수 없다. 보안을 위해 여러 겹의 서버나 통신이 있을 수 있고, 서버도 다른 서버와 통신하고 있는 경우가 있지만 클라이언트 입장에서는 철저하게 분리되어 있기 때문에 직접적으로 연결되어 있는 서버와의 관계만 신경써주면 된다.
5. Uniform Interface(인터페이스 일관성)
: URI로 지정된 자원에 대한 조작을 통일되고 한정적인 인터페이스로 수행한다. HTTP 표준 프로토콜을 따르는 모든 플랫폼에서 사용이 가능하며, 특정 언어나 기술에 제약받지 않는다.
6. Code-On-Demand(Optional)
: 서버로부터 스크립트를 받아서 클라이언트에서 실행하는데 반드시 충족할 필요는 없는 선택사항이다.
■ REST의 장단점
장점
- 언어와 플랫폼에 독립적이다
- REST API 메세지가 의도하는 바를 명확하게 나타내 의도를 쉽게 파악할 수 있다
- REST가 지원하는 프레임워크나 언어 등 도구들이 없어도 구현 가능하다
- HTTP를 사용하므로 기존 웹 인프라를 사용 가능하다
- 서버와 클라이언트의 역할을 명확히 분리한다
- 여러가지 서비스 디자인에서 생길 수 있는 문제를 최소화한다
단점
- HTTP 프로토코란 사용 가능하다
- P2P 통신 모델을 가정하여 둘 이상을 대상으로 하는 분산 환경에 유용하지 않다
- 보안, 정책 등에 대한 표준이 없다
🌵 그렇다면 RESTful API는 무엇일까?
RESTful API은 위의 설명에서처럼 REST를 기반으로 서비스 API를 구현한 것
그렇다면 어떻게 등장하게 되었나?
최근에는 서비스 개발 흐름은 멀티 플랫폼, 멀티 디바이스를 목표로 하여 개발되고 있는데 각각의 플랫폼에 맞추어 새로운 서버를 만드는 수고를 들이지 않기 위해 범용적으로 사용성을 보장하는 서버 디자인이 필요하게 되었다.
즉, 클라이언트 사이드를 정형화된 플랫폼이 아닌 모바일, PC, TV 등 플랫폼 개발에 제약을 두지 않기 위함이다.
■ RESTful API의 특징&장점
- REST 기반으로 개발된 시스템은 확장성과 재사용성이 높아 유지보수 및 운용이 편리하다
- REST는 HTTP 표준을 기반으로 구현하므로, HTTP을 지원하는 프로그램 언어로 클라이언트, 서버를 구현한다
- 즉, REST API를 제작하면 델파이 클라이언트뿐만 아니라 자바,C#, 웹 등을 이용해 클라이언트를 제작할 수 있다
■ RESTfuI API의 단점
- REST는 point-to-point 통신모델을 기본으로 한다. 따라서 서버와 클라이언트가 연결을 맺고 상호작용해야하는 어플리케이션 개발에는 적절하지 않다
- REST는 URI, HTTP 이용한 아키텍처링 방법에 대한 내용만을 담고 있다. 보안이나 통신규약 정책같은 것은 다루지 않는다. 따라서 개발자는 통신과 정책에 대한 설계와 구현을 도맡아서 진행해야 한다
- HTTP에 상당히 의존적이다. REST는 설계 원리이기 때문에 HTTP와는 상관없이 다른 프로토콜에서도 구현할 수 있기는 하지만 자연스러운 개발이 힘들다. 다만 REST를 사용하는 이유가 대부분의 서비스가 웹으로 통합되는 상황이기에 큰 단점이 아니게 되었다
- CRUD 4가지 메소드만 제공한다. 대부분의 일들을 처리할 수 있지만, 4가지 메소드 만으로 처리하기엔 모호한 상황이 있을 수 있다
■ RESTful API 설계 원칙
1. 자원을 식별할 수 있어야 한다
- URL(Uniform Resource Locator)만으로 내가 어떤 자원을 제어하려고 하는지 알아볼 수 있어야 한다. 자원을 제어하기 위해서 자원의 위치는 물론 자원의 종류까지 알 수 있어야 한다
- Server가 제공하는 정보는 JSON이나 XML형태로 HTTP body에 포함되어 전송시킨다
2. 행위는 명시적이어야 한다
- REST는 아키텍처 혹은 방법론과 비슷하다. 따라서 이런 방식을 사용해야 한다고 강제적이지 않다. 기존의 웹서비스처럼 GET을 이용해 UPDATE와 DELETE해도 된다
- 다만 REST 아키텍처에는 부합하지 않으므로 RESTful하다고 할 수 없다
3. 자기 서술적이어야 한다
- 데이터에 대한 메타정보만 가지고도 어떤 종류의 데이터인지 데이터를 위해서 어떤 어플리케이션을 실행해야하는지 알 수 있어야 한다
- 즉, 데이터 처리를 위한 정보를 얻기 위해서, 데이터 원본을 읽어야 한다면 자기 서술적이지 못하다
4. HATEOS(Hypermedia as the Engine of Application State)
- 클라이언트 요청에 대해 응답을 할 때, 추가적인 정보를 제공하는 링크를 포함할 수 있어야 한다
- REST는 독립적으로 컴포넌트들을 손쉽게 연결하기 위한 목적으로도 사용된다. 따라서 서로 다른 컴포넌트들을 유연하게 연결하기 위해선, 느슨한 연결을 만들어줄 것이 필요하다
- 이때 사용되는 것이 '링크'이다. 서버는 클라이언트 응용 어플리케이션에 하이퍼 링크를 제공한다
- 클라이언트는 이 하이퍼 링크를 통해서 전체 네트워크와 연결되며 HATEOAS는 서버가 독립적으로 진화할 수 있도록 서버와 서버, 서버와 클라이언트를 분리할 수 있게 한다
🌵 끄적끄적
클라이언트(프론트엔드)와 서버(백엔드)는 데이터를 주고받기 위해서는 API라는 중간자 역할의 인터페이스를 사용해야 한다.
따라서 API는 클라이언트-서버 간에 중요한 역할을 하는데 그 역할을 해내기 위해선 누가봐도 알아보기 쉬운 식별성을 지닐수록 개발자들이 추후 유지보수하기가 용이하며 올바른 설계를 통해 사용진행중에도 말썽을 덜 피운다.
그러니 초기 설계가 중요하고, RESTful API를 설계하기로 하였다면 모범사례와 원칙을 준수하여 작성하도록 하자.
References
'CS Store' 카테고리의 다른 글
[CS] 쿠키(Cookie)와 세션(Session)의 개념 및 특징, 차이점 (0) | 2023.05.28 |
---|---|
[CS] 웹 브라우저 공격 종류들과 보안책을 알아보자. (0) | 2023.05.27 |
[CS] 브라우저에 URL을 입력하고 보여지기까지의 과정 (0) | 2023.05.24 |
[CS] CORS의 개념,특징,에러해결방법에 대해 알아보자 (1) | 2023.05.19 |
[자료구조] Array(배열)과 Linked List(연결리스트)를 비교해보자 (0) | 2023.05.18 |