REST API란?
REST : Representational State Transfer API : Application Programming Interface
HTTP의 URL과 HTTP method(GET, POST, PUT, DELETE)를 사용하여 API 사용 가독성을 높인 구조화된 시스템 아키텍쳐(프레임워크)
- REST API를 통해 REST 서버는 API를 제공, 클라이언트는 사용자 인증이나 세션/로그인 정보 등을 직접 관리하는 구조로 각각의 역할이 확실히 구분되기 때문에 클라이언트와 서버에서 개발해야 할 내용이 명확해지고 서로 간 의존성이 줄어들게 됨.
- 데이터베이스 내부의 자료를 직접 전송하는 것이 아니라 HTML, XML, JSON와 같은 데이터 형태를 통해 제공하게 되고, 사용자들이 접근할 수 있게 되는 것
- URI는 자원을 표현하는 데에 집중하고 행위에 대한 정의는 HTTP METHOD를 통해 하는 것이 REST한 API를 설계하는 중심 규칙
필요성
프론트엔드 개발자와의 협업을 위한 것. 급격하게 높아지는 코드의 재활용성 -> 생산성 상승
- 한개의 API가 프론트엔드에서 여러개의 페이지에 이용됨.
- views.py에서 하나의 템플릿에 하나의 클래스, 함수가 호출되던 것과는 확연히 다름.
REST API의 구성
자원(RESOURCE) - URI 행위(Verb) - HTTP METHOD 표현(Representations)
[참고]HTTP METHOD의 알맞은 역할 POST, GET, PUT, DELETE 이 4가지의 Method를 가지고 CRUD를 할 수 있음.

다음과 같은 식으로 URI는 자원을 표현하는 데에 집중하고 행위에 대한 정의는 HTTP METHOD를 통해 하는 것이 REST한 API를 설계하는 중심 규칙.
REST API의 특징
REST 아키텍처는 다음과 같은 특징을 가지고 있음.
Uniform Interface
URI로 지정한 리소스에 대한 조작을 통일되고 한정적인 인터페이스로 수행하는 아키텍처 스타일. HTTP 표준 프로토콜을 따르는 모든 플랫폼에서 사용이 가능.
Stateless
작업을 위한 상태 정보(쿠키, 세션)를 보관하거나 관리하지 않고 요청만 처리하면 되므로 구현이 단순해짐.
Cacheable
웹 표준 프로토콜을 그대로 사용하므로 기존의 인프라를 활용할 수 있으므로 캐싱 기능을 사용 가능.
Self-descriptiveness
REST API 메시지만 보고도 쉽게 이해할 수 있는 자체 표현 구조로 되어 있음.
Client-Server
자원을 가진 쪽이 Server, 자원을 요청하는 쪽이 Client 각각의 역할이 확실히 구분되기 때문에 서로간 의존성이 줄어들게 됨
- Server : API를 제공하고 비즈니스 로직 처리 및 저장
- Client : 사용자 인증이나 상태 정보를 직접 관리
Layered System
REST 서버는 다중 계층으로 구성될 수 있으며 보안, 로드 밸런싱, 암호화 계층을 추가해 구조상의 유연성을 둘 수 있고 PROXY, 게이트웨이 같은 네트워크 기반의 중간매체를 사용할 수 있게 한다.
DRF(Django Rest framework)
Django안에서 Restful API 서버를 쉽게 구축할 수 있도록 도와주는 오픈소스 라이브러리
DRF의 장점 및 DRF를 사용하면 좋은 경우 - 범용성이 좋은 웹 브라우저 API를 사용한 쉬운 개발 - OAuth1, OAuth2를 위한 추가적인 패키지가 인증 정책에 추가되어 있는 경우 - DB data를 Json으로 직렬화하는(serialize)기능 - 국제적인 기업들을 포함해서 다수의 기업이 사용 -> 커뮤니티가 잘 되어 있음
설치
1. install using pip
pip install djangorestframework pip install django-filter
2. Add 'rest_framework' to your INSTALLED_APPS setting.
INSTALLED_APPS = [ ... 'rest_framework', ]
3. Add the following to your root urls.py file.
urlpatterns = [ ... path('api-auth/', include('rest_framework.urls')) ]
Serializer
DB data를 JSON data로 변환 (ORM, non-ORM 모두)
serializer: 파이썬 형식의 코드를 다른 네트워크 환경과의 통신을 위해 직렬화 할 때, DRF에서 직렬화를 담당하는 클래스.
queryset, model instance등의 복잡한 데이터를 python data type으로 변환시켜 json, xml등의 컨텐츠 타입으로의 변환을 쉽게 만들어 줌.
직렬화
데이터 구조나 오브젝트 상태를 동일한 포맷으로, 혹은 다른 컴퓨터 환경에 저장한 후 이후에 재구성할 수 있는 포맷으로 변환하는 과정
JSON, XML, YAML과 같은 문서 포맷이 주로 직렬화의 대상이 됨.
모든 프로그래밍 언어의 통신에서 데이터는 필히 문자열로 표현되야 함.
송신자 : 객체를 문자열로 변환하여 전송 -> 직렬화
수신자 : 수신한 문자열을 다시 객체로 변환하여, 활용 -> 비직렬화
IP, TCP, UDP는 네트워크를 가로지르는 메세지들의 데이터 타입이나, 의미를 찾을 수가 없고 그저 단순한 바이트의 흐름으로 봄.
따라서 응용 프로그램들은 바이트 흐름을 판독에 적합한 데이터로 직렬화하고, 반대로 바이트의 흐름으로 만들어주는 비직렬화 작업을 수행해야만 함.
- API 디버깅을 쉽게 만들어주며 - 코드를 정리해서 보안 이슈를 해결하기도 하며 - validation도 검증해준다.
HTTP 응답 상태 코드
잘 설계된 REST API는 URI만 잘 설계된 것이 아닌 그 리소스에 대한 응답을 잘 내어주는 것까지 포함되어야 함. 정확한 응답의 상태 코드 만으로도 많은 정보를 전달할 수가 있기 때문에 응답의 상태코드 값을 명확히 돌려주는 것은 생각보다 중요한 일이 될 수도 있음.
HTTP 응답 상태 코드
상태코드 | 속성 |
---|---|
200 | 클라이언트의 요청을 정상적으로 수행함 |
201 | 클라이언트가 어떠한 리소스 생성을 요청, 해당 리소스가 성공적으로 생성됨(POST를 통한 리소스 생성 작업 시) |
상태코드 | 속성 |
---|---|
301 | 클라이언트가 요청한 리소스에 대한 URI가 변경 되었을 때 사용하는 응답 코드 |
500 | 서버에 문제가 있을 경우 사용하는 응답 코드 |
실습
'Web > Backend' 카테고리의 다른 글
[백엔드 기초] 5. Docker (0) | 2021.06.01 |
---|---|
[백엔드 기초] 4. Database, PostgreSQL (0) | 2021.06.01 |
Django - Locust를 이용한 로드 테스트(Load test) (0) | 2021.06.01 |
[백엔드 기초] 2-1. Django (0) | 2021.06.01 |
[백엔드 기초] 2. Python (1) | 2021.06.01 |