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

2017.05.23 13:37

험프리 조회 수:15239

이 글에서는 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 14387
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 13023
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 15532
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 21064
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 22297
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 17933
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 38228
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 173741
1223 2020년 5월 GM 업데이트 - 여러분의 비즈니스에 길을 열어주세요! 관리자 2020.05.26 315
1222 델파이 안드로이드 개발을 위해 OpenJDK 채택 file 김원경 2020.05.25 888
1221 엠바카데로 오픈 소스 프로젝트 관리자 2020.05.25 699
1220 [10.4 시드니 신기능] 겟잇 패키지 매니저(GetIt Package Manager) 개선 험프리 2020.05.21 593
1219 [10.4 시드니 신기능] 컨트롤 개별 VCL 스타일 적용(Per-Control Style) 적용 험프리 2020.05.19 918
1218 [10.4 시드니 신기능] 새로운 VCL TEdgeBrowser 컴포넌트 험프리 2020.05.18 22880
1217 [10.4] 커스텀 매니지드 레코드(Custom Managed Records) 험프리 2020.05.14 1108
1216 [고객 사례- 솔루션, 델파이] Beyond Compare - 데이터, 시스템 비교/병합/관리 프로그램 관리자 2020.05.14 741
1215 델파이, 25년의 혁신 - 버전 1부터 10.3까지 버전별 핵심 기능 [2] 관리자 2020.05.12 2565
1214 [고객 사례- 솔루션, 델파이] AlignMix - 시각화된 세일즈 관리 도구 관리자 2020.05.12 364
1213 [10.4 시드니 신기능] 다시 태어난 '코드 인사이트' [2] file 험프리 2020.05.08 1661
1212 [발표자료] 20200429 델파이 Push 메시지 전송 시스템 구현 방법 with 구글 Firebase [3] file 관리자 2020.05.04 1020
1211 헬스케어 분야에서의 델파이 - 코로나에 맞서며 file 김원경 2020.04.29 604
1210 [고객 사례- 의료, 델파이] COVID-19 격리 대상자 상태 관리 앱 관리자 2020.04.28 643
1209 이 달의 기술자료 - 2020년 05월 file 험프리 2020.04.24 349
1208 [사례 소개] 데브기어 마이그레이션 유상 컨설팅 사례 험프리 2020.04.22 529
1207 인터베이스와 FireDac에서 배열필드 사용하기 file 김원경 2020.04.16 406
1206 인터베이스, FireDAC 및 TEMSDataSetResource를 사용하여 RAD 서버에서 자동 증가 필드를 생성하는 방법 file 김원경 2020.04.16 409
1205 델파이용 벡터 컨테이너 file 김원경 2020.04.14 752
1204 [프로그래밍 애피타이저] 개발이 처음이거나 비 전공자 분들을 위한 가장 첫 번째 STEP! 관리자 2020.04.13 2449