REST?, RESTful?, REST API? 가 도대체 뭐야?

REST?, RESTful?, REST API? 가 도대체 뭐야?

February 28, 2022

안녕하세요! 이번 포스팅은 웹에서 널리 쓰이고 있는 REST에 대해서 알아보려 합니다. REST는 로이 필딩(Roy Fielding)이라는 사람에 의해 2000년에 박사 논문에서 소개되었다고 합니다.

REST는 Representation State Transfer의 약자로 하이퍼미디어 시스템을 위한 소프트웨어 아키텍쳐의 한 형식입니다.

하이퍼 미디어(Hyper Media)?

모르는 단어가 나왔죠? 하이퍼 미디어는 뭘까요?
하이퍼 미디어란 텍스트, 도형, 애니메이션 및 비디오 화상 등 복수의 정보를 노드와 링크로 유기적으로 연결한 네트워크 그물망 구조를 뜻합니다.

링크 기능을 이용하여 정보를 유기적으로 연결하고 차례로 끌어내는 식으로 관련 정보를 대화식으로 끌어낼 수 있는 것이 특징입니다! 정보가 링크를 통해 연결되어 있다는 것이 핵심이에요!

그래서 REST가 뭔데?

REST는 자원(Resource)을 자원의 이름(자원의 표현: Representation)으로 구분하여 자원의 상태(State)를 주고 받는 모든 것을 뜻합니다.

이렇게 말하니 굉장히 어렵죠? 조금 더 쉽게 표현해보도록 하겠습니다.

image

자원은 우리가 흔히 인터넷 서핑을 하면서 보는 것들입니다. 텍스트, 동영상, 이미지 등 서비스가 제공하는 모든 것을 자원이라고 표현할 수 있습니다.

자원의 표현은 뭘까요? 자원에 이름을 붙인 것이라고 볼 수 있습니다.

인터넷에서 어떤 자료를 보기 위해서는 이름을 붙여주어야 합니다.

만약 다음과 같은 정보를 표현하고 싶을 떄를 생각해보죠.

image

  • 네 사자 이미지입니다. 하지만 네트워크는 어떻게 DB에 있는 사자 이미지를 출력할 수 있는 것일까요?
image
  • 다음 그림처럼 사자 이미지를 인터넷 브라우저는 자원의 이름을 통해서 호출 합니다.
  • 사진이에서 보시다시피 정확히는 자원을 담고 있는 링크를 통해 해당 자원을 요청하게 되는 것이죠.

이처럼 자원의 이름을 명시하고, 해당 이름을 통해 자원을 주고 받는 것자원의 표현 이라고 하는 것이죠 :)

근데 인터넷에서 이루어지는 작업은 사자 이미지를 얻어오는(GET) 작업만 있는 건 아니겠죠?

REST Method

REST는 HTTP 프로토콜을 통해 여러 요청을 처리할 수 있게 크게 4가지의 Method를 제공합니다.

  1. GET: 정보를 얻어오는 데에 중점을 둔 프로토콜입니다. 여러분이 네이버에 로그인하면 프로필에 자신의 정보가 뜨게 되죠? 네이버는 로그인 하고 메인 페이지를 로딩하는 과정에서 사용자의 프로필 정보를 요청(Request)하게 되고 서비스는 해당 정보를 반환하게 됩니다.
  2. POST: 정보를 생성하는데 중점을 둔 프로토콜입니다. 만약 여러분이 회원가입을 하게 되면 웹 브라우저에 기록된 사용자 정보가 DB에 반영되기 위해 POST Method를 통해 서비스에 전달됩니다.
  3. PUT: 정보를 수정하는데 중점을 둔 프로토콜입니다. 네이버에서 프로필을 수정하게 된다면 해당 프로토콜을 통해 수정된 정보를 서비스에 전달합니다.
  4. DELETE: 정보를 삭제하는데 중점을 둔 프로토콜입니다. 회원 탈퇴, 게시글 삭제 등 DB에 있는 레코드를 삭제하기 위해 서비스에 요청할 때 사용합니다

그럼 실제 데이터는 어떻게 주고 받아? (자원의 상태: State)

REST 개념에서 핵심은 자원을 주고 받는 방식에 있습니다.

실제 데이터는 XML이나, JSON포멧을 통해 파일을 주고 받게 되는데요. 예를 들어 아까전의 사자 사진은 이렇게 JSON으로 표현할 수 있습니다.

{
  "pic_name": "lion",
  "link": "https://cdn.example.com/img/lion.png"
}

▲ 예시 JSON

<?xml version="1.0"?>
<pic>
    <pic_name>lion</pic_name>
    <link>"https://cdn.example.com/img/lion.png"</link>
</pic>

▲ 예시 XML

이처럼 자원의 상태를 담은 값을 사용자에게 반환하고, 클라이언트는 해당 응답을 통해 적절한 태그(예: img tag) 속에 사자 이미지 링크를 부여하고 사용자에게 비로소 사자의 정보를 보여줄 수 있습니다.

REST의 6가지 제한조건

개발자는 다음 조건을 준수하며, REST의 프로토콜을 구현할 수 있습니다.

  1. 인터페이스 일관성(Uniform Interface): 인터페이스는 일관적으로 분리되어야 한다는 원칙입니다.
    • 특정 프레임워크나, 프로그램에 종속되는 형식이 아닌, REST를 따라 구현한 서비스의 경우 HTTP프로토콜을 통해 자원을 주고 받을 수 있어야 합니다.
  2. 무상태(Stateless): 각 요청간 클라이언트의 콘텍스트가 서버에 저장되어선 안된다는 원칙입니다.
    • 이는 이전 요청은 현재 요청에 절대 영향을 끼쳐서는 안된다는 원칙을 갖고 있습니다.
      • 예를 들어 로그인을 예시로 들 수 있습니다.
      • REST 이전과, 많은 서비스에서 현재에도 사용자 인증정보를 세션과 같은 형태로 서버에 저장하여 관리하고 있습니다.
      • 다만 완벽히 REST로 구현한 서비스라면, 인증정보는 사용자(클라이언트)가 직접 관리해야 합니다.
      • 일반적으로 로그인 정보를 JWT Token과 같은 형태로 암호화하여 헤더속에 저장하고, 인증이 필요한 요청마다 헤더에 인증정보를 담아 보내는 형식으로 로그인을 구현합니다.
  3. 캐시 처리 가능(Cacheable): REST는 웹 표준 HTTP프로토콜을 그대로 사용한다는 점에서 큰 장점이 있습니다.
    • 즉, HTTP캐싱기능을 사용할 수 있는 것입니다. 캐싱주어진 리소스의 복사본을 저장하고 있다가 요청 시에 그것을 제공하는 기술을 뜻합니다.
    • 만약 모든 자원을 요청할 때마다 서버에 요청한다면, 서버에는 큰 부담이 될 것입니다.
    • 그래서 이미 한번 받은 파일이나, 요청의 경우 HTTP 프로토콜은 이를 캐시파일로 저장해두었다가 이미 있는 자원의 요청의 경우 따로 서버에 요청하지 않고 해당 자원을 반환합니다.
  4. 계층화(Layered System): 클라이언트는 직접 서비스에 요청하지 않습니다. 서비스는 사용자를 위한 API서버를 준비해야 하며, 클라이언트는 해당 API서버를 통해 자원을 요청(Request)하고, 응답(Response)받을 수 있습니다.
    • 흔히 Spring에서 말하는 Controller, Django에서는 View가 클라이언트와 소통하는 대표적인 부분입니다.
      • 추가적으로 API Server는 비즈니스 로직만 수행하며, 앞단에 인증, 로드밸런싱 등의 추가적인 기능을 구현할 수 있습니다.
  5. Code On Demand: 클라이언트는 서버로부터 스크립트를 받아서 실행해야한다는 제한사항입니다. 다만 꼭 충족할 필요는 없습니다.
  6. 클라이언트 - 서버 구조(Server-Client): 자원을 보유한 쪽이 Server, 요청하는 쪽이 Client가 됩니다.
    • 서버: API제공, 비즈니스 로직 처리 및 저장을 담당합니다
    • 클라이언트: 서버에게 필요한 자원을 요청하며 추가적으로 사용자 인증이나 세션등을 관리하고 책임집니다

REST API

REST API란 앞서 명시한 REST 아키텍처를 기반으로 하여 클라이언트가 요청을 보내고 사용할 수 있게끔 구현한 인터페이스를 뜻합니다.

앞서 제가 프로젝트를 하며 구현했던 API의 예시를 보시죠!

image

위와 같이 API는 요청 URI, URI를 통해 응답받을 수 있는 자원의 상태(JSON), 요청 Method 등을 명시해야 합니다. 클라이언트 개발자는 해당 API를 보고 JSON이나, XML 내부의 데이터를 적절히 사용자에게 보여질 수 있도록 클라이언트를 구성합니다.

RESTful

RESTful이란 REST 아키텍처를 구현한 웹 서비스를 나타내기 위해 사용되는 용어입니다. 특정 웹 서비스가 REST API를 구현했다면 해당 서비스는 RESTful하다고 할 수 있습니다.

목적

누가봐도 직관적으로 이해할 수 있고, 사용하기 쉬운 API를 만드는 것을 목적으로 합니다.

마치며

  • 이번에는 웹에서 널리 사용하는 아키텍처인 RESTREST API, RESTful에 대해서 알아보았습니다.
  • 부족한 설명이 있거나 틀린 설명이 있다면 언제든 말씀해주세요. 즉각 반영하겠습니다!

Reference