안녕하세요, 하원입니다.
오늘은 RESTful 설계에 대해 소개해 보겠습니다.
REST & RESTful
종종 백엔드 개발자들이 RESTful하게 API를 설계한다고 말합니다.
RESTful하게 API를 설계할 때, 자원을 표현하는 URI는 명사로, 행위에는 동사가 들어가면 안 된다고 합니다.
하지만 이러한 규칙을 지키다 보면 괴상한 URI들이 등장하곤 하는데요,
과연 REST와 RESTful은 대체 무엇을 의미하고, 왜 등장했으며, 어떤 특징이 있을까요?
그리고 완벽한 RESTful API 설계가 무조건적으로 좋은 것일까요?
정의
REST는 Representational State Transfer의 약자로, 분산 하이퍼미디어 시스템을 위한 소프트웨어 아키텍처의 한 형식이라고 합니다.HTTP URI를 통해 자원(Resource)을 명시하고, HTTP Method(GET, POST, UPDATE, DELETE, PUT 등)를 통해 해당 자원에 CRUD Operation을 적용하는 것을 의미합니다.등장배경
SOAP API 방식은 보안 관련 표준들이 많아 금융 정보와 같은 보안에 민감한 데이터를 주고받을 때 많이 사용되었다고 합니다.REST 방식이라고 합니다.구성요소
특징
1. 서버-클라이언트 구조
2. 무상태성(Stateless)
3. 캐시 처리 가능
4. 계층화
5. 인터페이스 일관성
REST API와 RESTful API의 차이점
: REST 아키텍처를 기반으로 하는 API를 의미합니다.
: REST API를 제공하는 웹 서비스를 의미합니다.
: REST API 설계 규칙을 지킨 시스템을 RESTful하다고 말합니다.
REST API와 RESTful API는 사실상 비슷한 맥락의 단어지만, REST 원칙을 잘 따른다는 것을 강조할 때 RESTful이라는 단어를 사용한다고 합니다.
RESTful API 설계
그러면 RESTful하게 API를 설계할 때 어떤 규칙을 따를까요?
1. 자원을 표현할 때
2. 자원에 대한 행위를 표현할 때
/members/join/members/delete/13. 슬래시( / )로 계층 관계를 나타내기
4. 언더바( _ ) 대신 하이픈( - )을 사용
5. 파일 확장자를 URI에 포함하지 않기
/posters/1/image.pngRESTful 규칙을 항상 지켜야 하나요?
위와 같이 다양한 RESTful 규칙들이 존재합니다.
규칙들을 하나씩 살펴보면 어려운 규칙도 없고 꽤 간단하다고 볼 수도 있습니다.
하지만 위 규칙들 중 자원에 대한 행위를 표현할 때 동사 표현이 들어가지 않도록 설계해야 한다는 규칙이 개인적으로 까다로웠는데요..!
가끔 HTTP Method로 구분하기가 힘들고, 행위를 명사로 표현하기 힘든 경우가 존재합니다.
만약 어떤 API의 결과가 자원을 생성하거나 조작시키는 것이 아닌 프로세스를 처리해야 하는 경우라면, 어쩔 수 없이 동사를 사용할 수밖에 없습니다.
컨트롤 URI
이럴 때 사용하는 URI를 컨트롤 URI라고 부릅니다.
HTTP Method로 해결하기 어렵거나 애매한 경우에 사용하며, 실무에서도 많이 사용한다고 합니다.
또한, 최근 DELETE와 PUT과 같은 HTTP Method의 보안 취약 문제로 인해 사용하지 못하도록 차단하는 서버들이 존재합니다.
그래서 최근에는 동사형 단어를 사용하여 자원을 관리하는 설계 방법도 종종 사용한다고 합니다.
Ex)
결제 승인 : /payments
결제 취소 : /payments/cancel
완벽한 RESTful?
위와 같이 컨트롤 URI를 사용하게 되면 동사형 단어 사용으로 인해 RESTful 규칙에 어긋나겠죠?
하지만 REST나 RESTful 자체가 URI만 보고 어떤 기능을 수행하는지 한눈에 알 수 있도록 간결하게 표현하는 것이 목적이었기 때문에, 과도한 명사형 단어 지향으로 의미가 직관적으로 해석되지 않는 순간 그것은 REST의 의도에서 벗어난다고 생각합니다.
따라서 적절한 동사형 컨트롤 URI를 사용해 주는 것이 개인적으로 REST의 의도에 적합하다고 생각하는 바입니다.
마무리
RESTful 설계는 팀 프로젝트를 진행하면서 접해보게 되었다.
많이 들어보긴 했지만, 자세히 알지는 못해서 팀원들이 추천해 주는 URI를 그대로 사용한 적도 있었다.
하지만 과도한 명사형 단어를 사용하다 보니 URI가 괴상해지면서 이게 RESTful의 의도가 맞는 건지 의심이 되었다.
그래서 해당 포스팅을 작성하게 되었고, 이제는 REST의 탄생 배경과 여러 가지 의도를 알게 되면서 앞으로는 유연한 RESTful 설계를 해야겠다고 생각하게 되었다.