Web/Backend

[백엔드 기초] 3. Django REST Framework

 

 

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만 잘 설계된 것이 아닌 그 리소스에 대한 응답을 잘 내어주는 것까지 포함되어야 함. 정확한 응답의 상태 코드 만으로도 많은 정보를 전달할 수가 있기 때문에 응답의 상태코드 값을 명확히 돌려주는 것은 생각보다 중요한 일이 될 수도 있음.

실습

 

 

728x90