백엔드 서버를 공부하다 보면,
REST API? RESTful? ModelSerializer? 이런 단어들은 한번쯤은 들어봤을 것이다.
이번 게시글에서는 REST API가 무엇인지 소개해보려 한다!
먼저, REST API란 Representational State Transfer 의 약자로 해당 뜻을 해석해 보면
REST 라는 것이 무엇을 위한 것인지 어렴풋이 알 수 있다.
REST 의 Representational 와 State Transfer 즉, 표현과 상태 전송이라는 것은
리소스의 표현 방식을 통해서 해당 리소스의 상태를 클라이언트로 전달하는 방식을 의미한다.
만약 내가 "사용자"에 대한 자원의 정보를 얻고 싶다고 가정해보자.
내가 서버에 "사용자의 정보에 대해서 전달해주세요" 라는 메시지를 보내기 위해서는
먼저 서버에서 "사용자" 라는 자원의 표현을 정의해야지 나와 서버 모두 해당 자원을
특정할 수 있어 서버에 해당 리소스에 대한 정보를 요청할 수 있을 것이다.
이렇게 어떤 자원을 일컫는 말을 Representational 즉, 표현이라고 한다.
그럼 REST 에서 "상태 전송" 이라는 말은 무엇일까?
State Transfer 즉, 상태 전송은 위에서 표현된 리소스를 서버에 요청했을 때
서버가 나의 리소스 request 을 보고 데이터를 전달해주는 것을 말한다.
이때, 서버에서 나한테 보내준 데이터의 형식은 JSON 이나 XML 형식으로 보내준다.
데이터를 JSON 또는 XML 형식으로 보내는 이유는 HTTP 프로토콜을 이용하는 다른 플랫폼
예를 들어, 모바일 애플리케이션과 같은 클라이언트들과 데이터 통신을 할 수 있기 위해
JSON 또는 XML 과 같은 표준 데이터 형식으로 보내준다.
기존 Django 의 문제점은 Front-End 와 Back-End가 나눠지지 않고 장고 내부의
웹 Templates 을 사용하여 랜더링 하기 때문에 다른 프레임워크와의 확장성이 좋지 않고
데이터 전송 형식도 HTML Form
형태로 데이터를 전송하기 때문에 다른 플랫폼과
데이터 통신하기가 매우 어렵다.
위 Intro 부분에서 설명했던 것처럼, 장고는 FE 와 BE가 나눠진 것이 아니라 장고 내부의
웹 템플릿으로 HTML Form
형식의 데이터를 보내기 때문에
React 나 Angular 같은 다른 프레임워크와 함께 사용하거나 안드로이드 앱과 같은
다른 플랫폼과 데이터 통신을 위해서는 새로운 서버를 구축해야하는 문제점이 있다.
반면, REST API를 통해 백엔드 서버를 구축하게 된다면 데이터 전송 형식이 웹 템플릿 랜더링이나
HTML Form
형식으로 데이터를 보내는 것이 아닌 JSON 또는 XML 형태로 전달하기 때문에
FE 와 BE를 분리할 수 있어 React 나 Angular 같은 다른 프레임워크와 함께 사용이 가능하고,
안드로이드 앱이나 IOS 앱과 같은 다른 플랫폼과도 데이터 통신이 가능해진다.
REST API는 HTTP 프로토콜의 장점을 살려 설계된 아키텍쳐로 HTTP 프로토콜의 특징을 가진다.
따라서, CRUD 또한 HTTP Method 인 GET, POST, PATCH, PUT, DELETE 를 통해 이루어진다.
REST API 의 CRUD 예시 :
리소스 | POST | GET | PATCH | PUT | DELETE |
---|---|---|---|---|---|
/posts | 게시글 생성 | 전체 게시글 정보 요청 | Reject | Reject | Reject |
/posts/1 | Reject | 게시글 정보 요청 | 게시글의 일부 수정 | 게시글의 전체 수정 | 게시글 삭제 |
/posts/1/comments | 게시글 1의 댓글 생성 | 게시글 1의 댓글 정보 요청 | 게시글 1의 댓글 일부 수정 | 게시글 1의 댓글 전체 수정 | 게시글 1의 댓글삭제 |
그리고, 이 게시글을 작성하기 위해 자료조사 하던 와중 알게된 사실은
나는 일반 웹 서버 구축시에도 REST API와 같은 API 엔드포인트를 통해 구축하면 좋은줄 알았는데
일반 Web Service만 구축할 경우, REST API를 사용하지 않는 것이 더 좋다는 사실을 알게 되었다.
잘 생각해보면 어쩌피 Web Service만 사용할거면 잘 안쓸텐데 당연한 이야기 같다..
그럼 Django 에서는 REST API를 어떻게 구축해야 할까?
Django 에서는 DRF 즉, Django REST Framework 라는 프레임워크를 지원하고 있어
DRF를 통해 REST API를 좀 더 RESTful 하게 구현할 수 있다.
RESTful?
RESTful이란 REST API의 설계 규칙(원칙)을 잘 준수하여 REST API를 구축한 것을 "RESTful 하다" 라고 일컫는다.
설계 규칙은 RESTful 네이밍 규칙, Kakao REST API 를 참고하길 바란다.
DRF 에서는 데이터를 JSON 형식으로 하기 위해서 Serializer 클래스를 통해
내부적으로 데이터를 Serializer/Deserializer 하여 리소스를 관리한다.
이해를 위해 간단하게 그림으로 그려봤다.
실제로는 Authentication, Permission 등 여러 작업을 거쳐서 진행되지만
여기서는 Serializer 부분만 그렸다.
흐름을 보면
위 과정을 거쳐 클라이언트는 리소스를 얻을 수 있고, 서버는 클라이언트로 리소스를 제공해 준다.