백엔드 공부에 앞서
Rest가 무엇이며, RESTful한 서비스는 무엇인지에 대한 공부 기록이다.
REST
Representional State Transfer
자원을 이름으로 구분하여 해당 자원의 상태를 주고받는 것
REST와 다룰 개념들의 관계를 알아보자.
REST는 자원을 이름으로 구분한다. 구분하기 위해 사용하는 것이 URI&URL이다.
URL로 자원의 위치를 알아내고, URI로 개별 자원을 식별한다.
REST는 해당 자원의 상태를 주고 받는다.
이때 HTTP 프로토콜을 통해 주고받으며, HTTP 메소드를 이용해 자원을 다룬다.
자원
자원은 낯선 표현일 수 있지만, 소프트웨어가 관리하는 모든 것을 칭한다.
위에서 말한 대로 해당 자원은 각각의 이름으로 구분한다.
REST 개념
크게 리소스, 메소드, 메세지 3가지 요소로 구성된다.리소스와 메소드는 위처럼 각각 URI&URL과 HTTP메소드를 사용하며, 메세지는 요청과 함께 보내는 데이터로 JSON, XML 등이 있다.
REST 특징
유니폼 인터페이스
HTTP 표준에만 따른다면, 어떠한 기술이라던지 사용이 가능한 인터페이스 스타일이다.
HTTP + JSON, HTTP + XML 등 유연하게 사용이 가능하다.
무상태성(Stateless)
서버 측에서 클라이언트의 세션 상태에 관계없이 요청에 대한 응답만을 보낸다는 것.
요청이 서로 독립적으로 관리되므로 서버 쪽에서의 구현이 단순해진다.
HTTP 표준 사용
HTTP의 웹 표준을 그대로 사용하기 때문에 웹에서 사용하는 기존의 인프라를 그대로 활용가능하다.
클라이언트 서버 구조
개발 측면에서 서로의 역할이 명확하게 구분되고, 의존성이 줄어든다.
URI&URL
URI(Uniform Resource Idendtifier)
URI는 URL을 포함하는 개념이다.
또한 이름에서 볼 수 있듯 자원의 ID를 명시한다.
http://www.example.com/index.html?page=131이라는 URI가 있다고 가정해 보자.
앞서 언급한 대로 URI를 통해 서버의 자원의 이름을 명시하는데 위의 예시에서는 page값이라고 볼 수 있다.
page값은 하나의 자원의 고유한 ID일 것이기 때문이다.
URL(Uniform Resource Location)
URL은 이름에서도 볼 수 있듯 자원의 위치를 명시한다.
위의 예시에서 page값은 하나의 자원의 ID지만, 수많은 데이터에서 page값을 찾아주는 것은
index.html까지의 URL이다.
즉, URL은 고유한 ID를 찾을 수 있도록 자원의 위치를 알려주는 역할을 한다.
HTTP
REST 통신은 HTTP Method를 통해 자원에 대한 CRUD 기능을 수행한다.
HTTP 프로토콜은 GET, POST, PUT, DELETE와 같은 메서드를 제공한다.
CRUD(Create, Read, Update, Delete) 기능은 이름에서 볼 수 있듯
HTTP Method를 통해 수행될 수 있는 기능이다.
클라이언트의 요청과 서버의 응답으로 데이터를 주고받는다.
여기서 자원을 다루는 요청에 대해 인터페이스를 제공해주는 것이 API이다.
쉽게 말해 요청을 서버에 쉽게 전달해주는 역할을 한다.
REST API
REST API는 REST를 기반으로 서비스 API를 구현하는 것을 말한다.
REST API 설계 규칙
- 소문자 사용
- URI는 대문자가 아닌 소문자로 설계한다.
- www.example.com/Students (X)
- www.example.com/students (O)
- 언더바 대신 하이픈 사용
- 가독성을 위해 긴 명사는 하이픈을 이용해 구분한다.
- www.example.com/students_scores (X)
- www.example.com/students-scores (O)
- URI의 마지막에는 슬래시 포함하지 않음
- 마지막 슬래시는 의미가 없으므로, 포함하지 않는다.
- www.example.com/students/ (X)
- www.example.com/students (O)
- 계층 관계를 나타낼 때는 슬래시 구분자 사용
- www.example.com/buildings-schools (X)
- www.example.com/buildings/schools (O)
- 파일 확장자는 URI에 포함시키지 않음
- 파일 확장자는 요청 시 헤더의 Content-Type 속성을 통해 변경할 수 있다.
- www.example.com/students.json (X)
- www.example.com/students (O)
- 대부분의 경우 이용하는 자원의 명사를 사용하지만, 컨트롤 자원(다른 자원을 컨트롤하는 자원)을 의미하는 경우 동사 허용
- www.example.com/add-students (X)
- 자원의 명사는 복수형으로 작성
- 실무에서는 단수형이 아닌 복수형 명사를 쓰는 것이 일반적이다.
- www.example.com/student (X)
- www.example.com/students (O)
- URI에 Method를 포함하지 않는다.
- Method는 URI가 아닌 요청할 때 사용해서 전달하는 것이다.
- www.example.com/get-students (X)
- www.example.com/students (O)
응답 상태 코드
- 1XX : 전송 프로토콜에서의 정보 교환
- 2XX : 클라이언트 요청 성공
- 3XX : 클라이언트 측 추가적인 정보 필요
- 4XX : 클라이언트 측 잘못된 요청
- 5XX : 서버 측 오류
RESTful
RESTful 하다는 것은 적절한 REST API를 제공한다는 뜻이다.
즉, 위의 원리들을 모두 따른다는 뜻이다.
참고