REST와 RESTful API

RESTful API 로고

REST

REST란 Representational State Transfer 의 약자로 소프트웨어 프로그램 개발의 아키텍처의 한 형식입니다. Representational State Transfer- '대표적인 상태 전달' 이 단어만 듣고 REST가 무슨 뜻인지 알 수 있는 사람은 영어권에서도 없을 것이라고 생각이 되는데요, 저는 개인적으로 이 단어를 변형해서 '자원(resource)의 대표(representation)에 의한 상태 전달' 이라고 설명하려 합니다. 그럼 '자원의 대표'와 '상태 전달'이 무슨 뜻인지 알아봅시다.

자원의 대표

여기서 '자원'이란 뜻은 넓은 의미로 해당 소프트웨어가 관리하는 모든 것이 될 수 있습니다. 문서가 될 수도 있고 그림이 될 수도 있고 데이터가 될 수도 있고 심지어 해당 소프트웨어 자체가 될 수도 있습니다.  예를 들어 DB에 학생 명부가 저장되어 있다고 한다면 이 학생들의 정보가 자원이 됩니다. 그리고 '자원의 대표'의 의미는 그 자원을 대표하기 위한 이름을 뜻합니다. 학생데이터를 대표하기 위한 이름은 무엇이 좋을까요? 물론 학생(students:복수형을 사용합니다)입니다. 학생 전체 명부가 아니라 명부상의 한 학생에 대한 자원을 얻고자 한다면 대표이름과 한 학생을 특정할 수 있는 값(id 등) 이 사용됩니다.

상태 전달

데이터가 요청되어지는 시점에서 자원의 상태(정보)를 전달하는 것을 뜻합니다. 데이터를 요청하는 시점에 따라 데이터가 바뀔 수도 있기 때문에 '상태'라는 표현을 쓴 것이라 추측해 봅니다. 프로그램이 학생 명부 전체 리스트를 요청받으면 요청받은 시점의 '상태' 즉 데이터를 전달하게 됩니다. 또한 새로운 학생 명부 '상태'를 프로그램에 전달하여 해당 자원을 수정할 수도 있습니다.

이처럼 자원을 이름으로 구분하고 해당 자원의 상태를 주고 받는 모든 것이 REST라고 할 수 있지만, 일반적으로 REST라고 하면 좁은 의미로 HTTP를 통해 CRUD를 실행하는 API를 뜻합니다.

HTTP 프로토콜을 이용하기 때문에 URL(route)를 통해 자원을 특정짓고 HTTP Verbs를 통해 할일(CRUD)을 지정합니다. 또한 JSON 혹은 XML를 통해 데이터를 주고 받는 것이 일반적입니다.

위 정의에 더하여 REST를 정의하기 위한 조건들은 다음과 같습니다.

  • '클라이언트-서버' 구조: 자원(resource)이 있는 쪽이 서버가 되며, 요청을 하는 쪽이 해당 서버에 대한 클라이언트가 됩니다.
  • 무상태(Stateless): '서버'는 각각의 요청을 완전히 별개의 것으로 인식하고 처리해야하며, 이전 요청이 다음 요청의 처리에 연관이 되어서는 안됩니다. 물론 이전 요청이 DB를 수정하여 다음 요청이 DB에 의해 바뀌는 것은 괜찮습니다.(10분간 3번 비밀번호를 틀려서 더이상 로그인할 수 없는 경우 등). 서버의 처리 방식에 일관성을 부여하고 서버의 부담을 줄이기 위한 것으로 보입니다.
  • 캐시 처리 가능(Cacheable): 대량의 요청을 효율적으로 처리하기 위해 캐시가 요구됩니다.
  • 계층화(Layered System)
  • Code on demand (optional)
  • 인터페이스 일관성

RESTful

REST는 위 정의들을 구현하는 방식에 제약을 두지 않기 때문에 구체적인 가이드라인이 없습니다. 하지만 RESTful이라는 개념을 통해 그 가이드라인이 제시됩니다. RESTful는 REST를 REST답게 쓰기 위한 방법으로 누군가가 공식적으로 발표한 것이 아니라 여러 개발자들이 비공식적으로 의견을 제시한 것들로 명확한 정의는 없습니다. 즉 개발자마다 생각하는 RESTful의 내용이 다르다는 것이죠. 하지만 RESTful의 목적은 명확합니다. 이해하기 쉽고 사용하기 쉬운 REST API를 만드는 것입니다.

RESTful 중 그나마 이견이 적은 route을 설정하는 법에 대해 설명하겠습니다.

CRUDHTTP verbs
Route
resource들의 목록을 표시GET
/resource
resource 하나의 내용을 표시
GET/resource/:id
resource를 생성 
POST/resource
resource를 수정
PUT/resource/:id
resource를 삭제
DELETE/resource/:id
  • resource는 영어 복수형으로 적습니다
  • :id는 하나의 특정한 resource를 나타낼 수 있는 고유의 값입니다

예제:

  • student를 생성하는 route은 POST /students
  • id가 13인 student를 삭제하는 route은 DELETE /students/13

RESTful하지 못한 예:

  • CRUD(생성,조회,수정,삭제)기능을 모두 POST로만 처리하는 API
  • Route에 resource, id 외 정보가 들어가는 경우 (/students/updateName, student 하나의 이름만 변경하는 API의 경우 PUT students/:id/name이 되어야 합니다.)

댓글

편의점알바1호 2017.12.08
설명 엄청 깔끔하고 잘 된것같아요!! 다른데 가면 다 어려운 말만 써놔서 초보들은 이해하기 어려운데 핵심만 콕 짚어서 설명해주시는게 완전 전문가신것 같아요 ㅎㅎ 감사해요 ㅎㅎ 블로그 흥하길 바래용 ㅎㅎ
I
Ian H 2017.12.08
@편의점알바1호,
전문가가 아니라 초보자라서 설명이 자세합니다! 제가 이해가 잘 안되는게 있으면 넘어가질 못하는 성격이라 나름대로 이해가 될 때까지 찾아봤어요ㅋ
이창희 2018.01.28
안녕하세요~ API와 관련해서 몇 가지 여쭤볼게 있습니다. 혹시 제가 lan H님께 이메일을 보낼 수 있을까요? 아니면 댓글로 문의해야 할까요~? 
I
Ian H 2018.01.30
@이창희,
게시물 본문과 질문이 관계가 있으면 댓글로 남겨주시고 관계가 없다면 이메일로 보내주세요^^
h
heekyeom kim 2019.01.06
항상 해깔렸는데 도움이 많이 됬습니다!
I
Ian H 2019.01.07
@heekyeom kim,
도움이 되었다니 기쁘네요^^
댓글쓰기

이 글에 댓글을 다시려면 SNS 계정으로 로그인하세요. 자세히 알아보기

UP