공통 [REST API] REST API 이해하기

2017.05.23 13:37

험프리 조회 수:15458

이 글에서는 REST 아키텍처를 소개합니다.

 

 

REST는?

REST(Representational State Transfer)는 인터넷 상의 컴퓨터 시스템간 상호 운용성을 제공하는 방법 중 하나입니다. 

 

REST는 HTTP 기반으로 필요한 자원에 접근하는 방식을 정해놓은 네트워크 아키텍처입니다.

여기서 자원이란, 저장된 데이터(DBMS 등)는 물론, 이미지/동영상/문서(PDF 등)와 같은 파일, 서비스(이메일 전송, 푸쉬 메시지 등) 등을 모두 포함합니다.

 

REST는 HTTP의 주요 저자 중 한사람인 로이 필딩의 2000년 박사학위 논문에서 처음 소개되었습니다.

 

REST의 제약조건

아래 REST 제약조건을 준수하는 웹서비스를 RESTful 하다고 합니다.

  • 클라이언트/서버 : 클라이언트와 서버가 각각의 역할 구분. 서버는 API를 제공하고 API 요청 시 비지니스 로직 처리와 데이터 저장을 책임. 클라이언트는 사용자 인증, 상태(세션, 로그인 정보)관리와 서버 리소스 요청을 책임지는 구조로 역할 구분(상호 의존성을 줄임)
  • 무상태(Stateless) : REST 서버는 작업을 위한 상태정보(세션, 쿠키 등)를 관리하지 않아야 함. 시스템 영향없이 관리 및 업데이트 가능
  • 캐쉬(Cacheable) : HTTP 웹표준으로 HTTP가 가진 캐싱 기능이 적용됨
  • 계층화(Layered system) : 서버를 다중 계층으로 구성될 수 있음. 비지니스 로직을 수행하는 API 서버와 그 앞단에 사용자 인증, 암호화, 로드밸런싱 등의 계층을 추가해 구조상의 유연성 제공
  • 인터페이스 일관성(Uniform interface) : 아키텍처를 단순화하고 분리해 각 부분을 독립적으로 발전 시킬 수 있음

REST API

REST 기반으로 서비스 API를 구현한 것을 REST API라고 합니다.

 

최근 OpenAPI(누구나 사용할 수 있도록 공개된 API: 구글 맵, 공공 데이터 등), 마이크로 서비스(하나의 큰 애플리케이션을 여러 개의 작은 애플리케이션으로 쪼개어 변경과 조합이 가능하도록 만든 아키텍처) 등을 제공하는 업체 대부분은 REST API를 제공합니다. 

 

 

또, 사내 시스템들도 REST 기반으로 시스템을 분산해 확장성과 재사용성을 높여 유지보수 및 운용을 편리하게 할 수 있습니다. 

 

REST는 HTTP 표준을 기반으로 구현하므로, HTTP를 지원하는 프로그램 언어로 클라이언트, 서버를 구현할 수 있습니다. 

즉, REST API를 제작하면 델파이 클라이언트 뿐 아니라, 자바, C#, 웹 등을 이용해 클라이언트를 제작할 수 있습니다. 물론 반대의 방법도 가능합니다.

REST 주요 구성요소

REST 주요 구성요소는 리소스, 메소드, 메시지 3가지 입니다.

 

  • 리소스 : 접근할 대상, URI를 통해 식별
  • 메소드 : 리소스에 대한 행위, 표준 HTTP 메소드에 따라 자원에 접근(생성, 조회, 수정, 삭제)
  • 메시지 : HTTP 해더와 바디에 포함된 메시지는 메시지를 처리하기 위한 충분한 정보를 포함

즉, REST는 어떤 자원(리소스)에 어떤 행위(메소드)를 어떻게(메시지) 할지 HTTP 기반으로 정해놓은 아키텍처입니다.

 

리소스(자원)

리소스는 URI를 통해 정의합니다.

 

예를 들면, 아래와 같은 URI는 다음과 같은 의미를 갖습니다.

 URI 

 의미 

 http://api.domain.com/books/

 도서정보 콜렉션 

 http://api.domain.com/books/1/ 

 1번 도서 정보 

 http://api.domain.com/books/1/photo/

 1번 도서의 사진

 

리소스명은 동사보다 명사를 활용해 어떤 자원인지 표현하는데 집중해야 합니다.(/getBooks/와 같은 리소스는 적절하지 않습니다.)

 

슬래시(/)는 계층 관계를 나타내며, URI 앞쪽부터 넓은 의미로 사용합니다.

일반적으로 계층은 컬렉션(목록) 하위에 아이템을 지정하는 방식으로 정의합니다.

 

아래와 같이 URI를 구성할 수 있습니다.

/sports/soccer/players/1/

/(컬렉션)/(아이템)/(컬렉션)/(아이템)/

 

메소드

REST에서는 메소드를 통해 리소스에 대한 행위를 정의합니다.

 

표준 HTTP 메소드 중 Get, Post, Put, Delete를 통해 자원의 CRUD를 정의합니다.

 HTTP 메소드

 자원에 대한 행위

 POST

 자원 생성(Create)

 GET

 자원 조회(Read)

 PUT

 자원 수정(Update)

 DELETE

 자원 삭제(Delete)

 

Endpoint

다음과 같이 메소드와 URI를 이용해 리소스에 접근합니다. URI 별 HTTP 메소드로 구현된 항목을 Endpoint라고 합니다.

 HTTP 메소드 

 URI(자원)

 Endpoint의 행위

 POST

 http://api.domain.com/books/

 새로운 도서정보 생성

 GET

 http://api.domain.com/books/

 도서정보 목록 조회

 GET

 http://api.domain.com/books/1/

 1번 도서정보 조회

 PUT

 http://api.domain.com/books/1/

 1번 도서정보 수정

 DELETE

 http://api.domain.com/books/1/

 1번 도서정보 삭제

 

메시지

REST에서 자원에 대한 정보는 HTTP 바디와 HTTP 해더, 응답 상태코드를 활용합니다.

 

 

HTTP 바디

HTTP 바디에 포함된 데이터를 통해 자원에 대한 정보를 전달합니다.

 

데이터 포맷으로는 최근 JSON을 많이 사용하는 추세이며, XML과 사용자정의 포맷 등을 정해서 사용할 수도 있습니다.

 

조회(GET 메소드) 요청 시 서버는 조건에 맞는 정보를 HTTP 바디에 담아 클라이언트에 응답합니다.

생성(POST 메소드), 수정(PUT 메소드) 요청 시 클라이언트는 자원에 대한 정보를 요청 HTTP 바디에 담아 서버에 요청합니다.

 

 

HTTP 해더

HTTP 해더에는 HTTP 바디의 컨텐츠 종류를 명시할 수 있습니다. 해더에 정의된 컨텐츠 타입에 따라 데이터를 분석하도록 구현해야 합니다.

요청 HTTP 해더는 "Accept" 항목으로, 응답 HTTP 해더는 "Content-type"으로 컨텐츠 타입을 설명합니다.

 

 

몇가지 컨텐츠 타입은 다음과 같습니다.

  • application/json
  • application/xml
  • text/plain
  • image/jpeg
  • image/png

미디어 타입, 컨텐츠 타입 자세히 보기 : https://ko.wikipedia.org/wiki/미디어타입

 

응답 상태코드

리소스 요청에 대한 응답은 응답 상태코드로 설명할 수 있습니다.

대표적인 응답 상태코드는 아래와 같습니다.

  • 200 - 요청을 정상 수행
  • 201 - 리소스 생성 요청 성공(Post로 생성 요청 시에 한함)
  • 400 - 요청이 부적절함
  • 401 - 인증되지 않은 상태에서 보호된 리소스 요청
  • 403 - 공개되지 않은 리소스에 접근 요청(인증과 무관)
  • 404 - 존재하지 않는 리소스 요청
  • 406 - 지원하지 않는 미디어타입을 요청
  • 409 - 리소스 상태에 의해 해당 요청을 수행하지 못함

HTTP 상태코드 자세히 보기 : https://ko.wikipedia.org/wiki/HTTP_상태_코드

 

REST API 구현

델파이로 REST API 구현

델파이의 HTTP 라이브러리를 이용핸 REST API를 구현할 수 있습니다.

REST API 구현해 특화된 기술은 서버 측 기술로는 EMS 서버 클라이언트 기술로는 REST 클라이언트 라이브러리가 있습니다.

 

서버(Back-End) 프레임워크

  • RAD Server(EMS Server) - REST API Endpoint 제공
  • WebBroker - RAD 스튜디오(델파이, C++빌더) 웹 개발 프레임워크
  • DataSnap - RAD 스튜디오 멀티티어 개발 프레임워크, TCP/IP, HTTP 프로토콜 제공
  • Delphi MVC Framework - 오픈소스 웹서비스 개발 프레임워크
  • mORMot - 오픈소스 SOA, ORM 개발 프레임워크

 

 

클라이언트(Front-End) 프레임워크

  • REST Client - REST 클라이언트 프레임워크
  • Net HTTP Client - 네이티브 HTTP 클라이언트 프레임워크
  • Indy Library - 범용 네트워크 라이브러리(HTTP 클라리언트, 서버 제공)

 

추가 학습할 내용

EMS 패키지 프로젝트 시작하기

EMS 패키지는 REST API 리소스와 엔드포인트 개발을 지원합니다. EMS 패키지 프로젝트를 만들고, 배포하는 내용을 학습할 수 있습니다.

REST API 서버 개발하기(엔드포인트 구현, RAD 서버 이용)

EMS 패키지를 이용해 REST API를 제공하는 서버를 개발합니다. 미리 준비된 DB를 이용해 조회, 입력, 수정, 삭제, 이미지 제공 등의 기능을 실습위주로 학습합니다.

REST API 클라이언트 개발하기(REST 클라이언트 이용)

위에서 작성한 REST API 서버와 연동하는 클라이언트를 개발합니다. REST API를 분석해 조회, 입력, 수정, 삭제, 이미지 수신 기능을 실습위주로 학습합니다.

 

참고 링크


번호 제목 글쓴이 날짜 조회 수
공지 [DelphiCon 요약] 코드사이트 로깅 실전 활용 기법 (Real-world CodeSite Logging Techniques) 관리자 2021.01.19 22591
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 21024
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 23082
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 28880
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 30050
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 25397
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 46347
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 182316
763 안드로이드에서 Firebase SDK 용 Google 로그인 사용하기 험프리 2017.08.04 698
762 첨부파일을 포함한 이메일 전송하기(iOS, 안드로이드, 윈도우) file 험프리 2017.08.04 738
761 이 달의 기술자료 - 2017년 08월 험프리 2017.07.28 562
760 세일즈포스(Salesforce) 데이터, RAD스튜디오 데이터 익스플로러로 연동하기 file 관리자 2017.07.26 880
759 Tools API를 사용해 IDE를 확장할 수 있습니다. file 험프리 2017.07.20 579
758 파이어몽키(FireMonkey) vs. VCL 관리자 2017.07.18 2922
757 엔터프라이즈 커넥터로 '트위터' 연동하기 file 관리자 2017.07.17 976
756 엔터프라이즈 커넥터 - 엠바카데로의 새로운 솔루션 [1] file 관리자 2017.07.12 2037
755 겟잇 패키지 매니저를 사용하면 협업을 위한 프로젝트 공유와 전환이 간편해집니다. 험프리 2017.07.07 507
754 이 달의 기술자료 - 2017년 07월 험프리 2017.07.03 547
753 [업데이트][핫픽스][10.2 도쿄] FireMonkey의 Android 호환성 패치 험프리 2017.07.03 741
752 [발표자료] 20170623 최신OS와 멀티플랫폼 개발 전략 with RAD Studio [2] 관리자 2017.06.26 418
751 [고객 사례- 쇼핑, 모바일앱, 델파이] 매일 최저가 상품을 보여주는 'Daily Offer' 관리자 2017.06.21 743
750 RAD서버로 개발은 확장하면서도 비용을 절감하는 방법 (RAD서버 라이선스 유형별 정리) file 관리자 2017.06.20 1699
749 [REST API][실습] 데이터셋 기반 REST API 개발하기 험프리 2017.06.13 2309
748 이 달의 기술자료 - 2017년 06월 file 험프리 2017.05.30 585
747 [발표자료] REST API 웹서비스 연동 관리자 2017.05.29 1515
746 [REST API][실습] REST API 클라이언트 개발하기(REST Client 이용) [2] 험프리 2017.05.23 7383
745 [REST API][실습] REST API 서버 개발하기(엔드포인트 구현, RAD 서버 이용) [5] 험프리 2017.05.23 4864
» [REST API] REST API 이해하기 험프리 2017.05.23 15458