RESTful API는 두 컴퓨터 시스템이 인터넷을 통해 정보를 안전하게 교환하기 위해 사용하는 인터페이스
API란
애플리케이션 프로그래밍 인터페이스(API)는 다른 소프트웨어 시스템과 통신하기 위해 따라야 하는 규칙을 정의한다. 개발자는 다른 애플리케이션이 프로그래밍 방식으로 애플리케이션과 통신할 수 있도록 API를 표시하거나 생성한다. 웹 API는 클라이언트와 웹 리소스 사이의 게이트웨이라고 생각할 수 있다.
클라이언트
클라이언트는 웹에서 정보에 액세스하려는 사용자다. 클라이언트는 API를 사용하는 사람이거나 소프트웨어 시스템일 수 있다.
리소스
리소스는 다양한 애플리케이션이 클라이언트에게 제공하는 정보로서 리소스는 이미지, 동영상, 텍스트, 숫자 또는 모든 유형의 데이터일 수 있다. 클라이언트에 리소스를 제공하는 시스템을 서버라고도 한다. 조직은 API를 사용하여 리소스를 공유하고 보안, 제어 및 인증을 유지하면서 웹 서비스를 제공한다. 또한 API는 특정 내부 리소스에 액세스할 수 있는 클라이언트를 결정하는 데 도움이 된다.
REST란 무엇일까?
Representational State Transfer(REST)는 API 작동 방식에 대한 조건을 부과하는 소프트웨어 아키텍처이다. REST는 처음에 인터넷과 같은 복잡한 네트워크에서 통신을 관리하기 위한 지침으로 만들어졌다. REST 기반 아키텍처를 사용하여 대규모의 고성능 통신을 안정적으로 지원할 수 있다. 쉽게 구현하고 수정할 수 있어 모든 API 시스템을 파악하고 여러 플랫폼에서 사용할 수 있다.
REST 아키텍처 스타일을 따르는 API를 REST API라고 하는데 REST 아키텍처를 구현하는 웹 서비스를 RESTful 웹 서비스라고 한다. RESTful API라는 용어는 일반적으로 RESTful 웹 API를 나타낸다. 하지만 REST API와 RESTful API라는 용어는 같은 의미로 사용할 수 있다.
아래는 REST 아키텍처 스타일의 몇 가지 원칙이다.
- 균일한 인터페이스
균일한 인터페이스는 모든 RESTful 웹 서비스 디자인의 기본입니다. 이는 서버가 표준 형식으로 정보를 전송함을 나타냅니다. 형식이 지정된 리소스를 REST에서 표현이라고 부르는데 이 형식은 서버 애플리케이션에 있는 리소스의 내부 표현과 다를 수 있다. 예를 들어, 서버는 데이터를 텍스트로 저장하되, HTML 표현 형식으로 전송할 수 있다.
균일한 인터페이스에는 아래와 같이 4가지 아키텍처 제약 조건이 있다.
- 요청은 리소스를 식별(URL)해야 한다. 이를 위해 균일한 리소스 식별자를 사용한다.
- 클라이언트는 원하는 경우 리소스를 수정하거나 삭제하기에 충분한 정보를 리소스 표현에서 가지고 있다. 서버는 리소스를 자세히 설명하는 메타데이터를 전송하여 이 조건을 충족한다.
- 클라이언트는 표현을 추가로 처리하는 방법에 대한 정보를 수신한다. 이를 위해 서버는 클라이언트가 리소스를 적절하게 사용할 수 있는 방법에 대한 메타데이터가 포함된 명확한 메시지를 전송한다.
- 클라이언트는 작업을 완료하는 데 필요한 다른 모든 관련 리소스에 대한 정보를 수신한다. 이를 위해 서버는 클라이언트가 더 많은 리소스를 동적으로 검색할 수 있도록 표현에 하이퍼링크를 넣어 전송한다.
- 무상태(stateless)
REST 아키텍처에서 무상태는 서버가 이전의 모든 요청과 독립적으로 요청을 완료하는 통신 방법을 나타냅니다. 클라이언트는 임의의 순서로 리소스를 요청할 수 있으며 모든 요청은 무상태이거나 다른 요청과 분리된다. - 계층화 시스템
계층화된 시스템 아키텍처에서 클라이언트는 클라이언트와 서버 사이의 다른 승인된 중개자에게 연결할 수 있으며 여전히 서버로부터도 응답을 받는다. 서버는 요청을 다른 서버로 전달할 수도 있고 클라이언트 요청을 이행하기 위해 함께 작동하는 보안, 애플리케이션 및 비즈니스 로직과 같은 여러 계층으로 여러 서버에서 실행되도록 RESTful 웹 서비스를 설계할 수 있습니다. - 캐시 가능성
RESTful 웹 서비스는 서버 응답 시간을 개선하기 위해 클라이언트 또는 중개자에 일부 응답을 저장하는 프로세스인 캐싱을 지원한다. RESTful 웹 서비스는 캐시 가능 또는 캐시 불가능으로 정의되는 API 응답을 사용하여 캐싱을 제어한다. - 온디맨드 코드
REST 아키텍처 스타일에서 서버는 소프트웨어 프로그래밍 코드를 클라이언트에 전송하여 클라이언트 기능을 일시적으로 확장하거나 사용자 지정할 수 있다.
REST API의 요청(REQUEST)
- 고유 리소스 식별자(URL)
서버는 일반적으로 URL을 사용하여 리소스를 식별하고 URL은 리소스에 대한 경로를 지정한다. URL은 요청 엔드포인트라고도 하며 클라이언트가 요구하는 사항을 서버에 명확하게 지정 한다. - METHOD
HTTP METHOD는 수행해야할 작업을 서버에 알려주는데 GET, POST, UPDATE, DELETE 4가지의 일반적인 방식이 있다. - HTTP HEADER
요청 헤더는 클라이언트와 서버 간에 교환되는 메타데이터다. 요청 헤더는 요청 및 응답의 형식을 나타내고 요청 상태 등에 대한 정보를 제공한다.
REST API의 응답(RESPONSE)
- 상태 표시줄
상태 표시줄에는 요청 성공 또는 실패를 알리는 3자리 상태 코드가 있으며 2XX 코드는 성공을 나타내고 4XX 및 5XX 코드는 오류를 나타낸다. 3XX 코드는 URL 리디렉션을 나타낸다. - 메세지 본문
응답 본문에는 리소스 표현이 포함되는데 서버는 요청 헤더에 포함된 내용을 기반으로 적절한 표현 형식(XML, JSON과 같은)을 선택합니다. - HEADER
응답에는 응답에 대한 헤더 또는 메타데이터도 포함된다. 이는 응답에 대한 추가 컨텍스트를 제공하고 서버, 인코딩, 날짜 및 콘텐츠 유형과 같은 정보를 포함한다.
RESTful API의 장점
- 확장성
REST가 클라이언트-서버 상호 작용을 최적화하기 때문에 효율적으로 크기 조정할 수 있다. 무상태(stateless)는 서버가 과거 클라이언트 요청 정보를 유지할 필요가 없기 때문에 서버 로드를 제거하고 잘 관리된 캐싱은 일부 클라이언트-서버 상호 작용을 부분적으로 또는 완전히 제거한다. 이러한 모든 기능은 성능을 저하시키는 통신 병목 현상을 일으키지 않으면서 확장성을 지원한다. - 유연성
완전한 클라이언트-서버 분리를 지원한다. 각 부분이 독립적으로 발전할 수 있도록 다양한 서버 구성 요소를 단순화하고 분리한다. 서버 애플리케이션의 플랫폼 또는 기술 변경은 클라이언트 애플리케이션에 영향을 주지 않아 애플리케이션 함수를 계층화하는 기능은 유연성을 더욱 향상시킨다. - 독립성
REST API는 사용되는 기술과 독립적이다. 다양한 언어로 서버와 클라이언트를 구성할 수 있고 통신에 영향이 가지 않고 기술을 변경할 수 있다.
RESTful API의 단점
- 안티패턴의 가능성
- HTTP METHOD를 GET과 POST만 사용할 경우
- HTTP RESPONSE CODE를 200과 500만 사용하고 하위 데이터 속성으로 세부 에러 내용을 표현할 경우
- 표준 규약이 없다
표준이 없기에 성공적인 REST API를 참고하거나 각각의 기업의 정책에 따라 다르다. - RDBMS의 표현에 적합하지 않다
REST API의 경우 리소스를 표현할 때 JSON, XML과 같은 형태로 표현하기 때문에 표현에 적합하지 않을 수 있다.
출처: https://aws.amazon.com/ko/what-is/restful-api/
RESTful API란 무엇인가요? - RESTful API 설명 - AWS
Amazon API Gateway는 어떤 규모에서든 개발자가 API를 손쉽게 생성, 게시, 유지 관리, 모니터링 및 보안 유지할 수 있도록 하는 완전관리형 서비스입니다. API Gateway를 사용하면 실시간 양방향 통신 애
aws.amazon.com
참고 : https://round-round.tistory.com/entry/REST-API%EC%9D%98-%EB%8B%A8%EC%A0%90-3%EA%B0%80%EC%A7%80
'개발상식' 카테고리의 다른 글
SOAP과 REST 연동 (0) | 2024.01.30 |
---|---|
Web Storage - Local Storage, Session Storage (0) | 2021.05.10 |
대칭키와 비대칭키(공개키) (0) | 2021.05.06 |
보일러플레이트(boilerplate)란 (0) | 2021.01.28 |
Hash란 (0) | 2020.12.21 |