Rest API 란
에전부터 REST 한 API 를 짜야된다 는 말은 많이 들었고 그걸 코드에 나름대로 녹였다고 생각했지만
스스로 REST 의 이해도에 대한 아쉬움과 최근 들어 MSA 에 대한 관심도, 중요성이 올라가면서
알아가다보니 REST API 와 닮은 부분이 많아서 REST 한것이란 뭘까 에 대한 나의 생각과 알려진
정보들을 얘기 할수있는것이 중요하다 생각되어서 정리를 해보았다.
Rest : Refresentational State Transfer
즉 자원에 대한 표현에 의한 상태(정보)를 전달하는 것을 의미한다.
필자는 여기서 state 를 상태 보단 정보라는 의미로 받아들여서 해석하는것이 더 매끄러워 정보라고 표현하겠다.
자원은 말 그대로 우리가 사용하는 Resourece 를 의미한다.
쇼핑몰 사이트라면 유저, 상품, 주문, 등 이 될수있다.
자원에 대한 표현은 자원 이라는 테이블이 가지고 있는 컬럼 값 과 같이 해당 자원을 표현해주는 요소들을 의미한다. Body, Query 등이 이에 해당한다.
ex. Member : [{id : 1, name : "유저1", age : 23}]
정리하면 REST API 란 URL 에 자원을 명시하고 HTTP 메소드를 통해 해당 자원에 표현을 가지고 CRUD 를 적용하는것이다.
어떤것이 REST API 라는 정해진 규칙은 없으나 많은 사람들이 얘기하는 공통적인 사항들을 정리해볼려고 한다.
REST API 의 특징
우리는 왜 RESTFul 한 API 를 만들어야 하며 이러한 개념이 나오게된 배경은 무엇일까?
캐시 처리
HTTP 웹 표준 특징을 그대로 따르기 때문에 기존의 웹 표준 기능 중 하나 인 캐시 기능을 사용할수있다.
또한 무상태를 지향하기 때문에 각 요청이 독립적이고 이전 요청에 대한 상태를 저장하지 않기에 캐시에 더 유리한 환경이 만들어진다.
다만 캐시 처리가 불가능한 상황도 꽤나 많다. ex. 유저마다 다르게 표현되는 동적페이지, 서버 자체 보안으로 인한 캐시 금지, 데이터 특성 상 빠른 변화가 필요할때
무상태
요청이 독립적 이란걸 의미하며 각 요청은 이전 요청의 상태, 클라이언트의 상태를 고려할 필요가 없다.
확장성 : 클라이언트의 상태를 고려할 필요가 없으니 여러 클라이언트, 디바이스 등에 동일한 처리가 가능하므로 높은 확장성을 지닌다.
복잡도 감소 : 동일한 요청을 보내서 동일한 처리를 하니 요청의 일관성은 높아지고 단순화 되기에 복잡도가 감소한다.
계층화
자원을 명시한 일관된 URI ( example.com/product) 를 사용하므로 해당 URI 로 들어올시 로드 밸런싱을 통해 요청에 대한 연산을 수행할 수 있다.
계층화 특성 덕분에 특정 URI 자원에 대한 보안계층을 설정하는것도 가능하다.
계층화 특성 덕분에 특정 URI 자원에 대한 캐시구성도 가능하다.
일관성 및 가독성
설계 규칙에 따르기에 일관된 인터페이스를 제공해 일관성과 가독성을 높여 다양한 이점을 가져온다.
Server - Client 구조
서버는 요청에 응답을 클라이언트는 응답에 대한 처리를 각각 적절한 역할분배로 서로의 의존성을 낮춘다.
REST API 설계 규칙
/ (슬래시)는 계층 관계를 나타낸다.
ex. www.example.com/Item/color
위에 예시와 같이 상품 안에 색상, 사이즈 등 과 같이 계층 관계를 표현한다.
_(언더바) 사용은 자제하고 -(하이픈) 사용을 권장한다.
언더바는 가독성이 좋지 않기에 사용을 자제하고 하이픈으로 대체하여 사용한다.
다만, 하이픈 사용도 최대한 줄일수있다면 줄이는것이 좋다.
대문자 보다는 소문자를, 동사보다는 명사를 사용하자
RFC3986 은 URI 스키마, 호스트를 제외하고 대소문자를 구별하도록 규정했기 때문에 소문자를 사용하자
이미 HTTP METHOD 에서 해당 자원의 행동을 명시하기에 동사 사용은 중복의미 이므로 자제하자
파일 확장자는 URL 에 포함하지 않는다.
대신 ACCEPT HEADER 에 추가해서 사용하면 된다.
URL 마지막 부분에 / 를 포함하지 않는다.
/ 를 사용하는것은 마지막에 작성된 자원에 대한 또 다른 계층이 있다는걸 의미하며 기존과는 다른 자원을 의미하는것이기 때문이다.
Resource 를 나타내는 정보는 ID 와 같이 유니크 한 값으로 명시하자
Last updated