45장. RESTful 웹 서비스 소개
초록
REST(Representational State Transfer)는 네 가지 기본 HTTP 동사만 사용하여 HTTP를 통해 데이터 전송을 중심으로 하는 소프트웨어 아키텍처 스타일입니다. 또한 모든 추가 래퍼를 사용하고 모든 상태 데이터를 사용할 수 있습니다.
45.1. 개요
REST( Representational State Transfer )는 Roy Fielding이라는 연구원에 의해 의사 간해에 설명된 아키텍처 스타일입니다. RESTful 시스템에서 서버는 URI를 사용하여 리소스를 노출하고 클라이언트는 4개의 HTTP 동사를 사용하여 이러한 리소스에 액세스합니다. 클라이언트가 리소스를 수신하면 상태가 됩니다. 일반적으로 링크 다음에 따라 새 리소스에 액세스하면 해당 상태가 변경되거나 전환됩니다. 작업하기 위해 REST는 리소스가 광범위한 표준 문법을 사용하여 표현될 수 있다고 가정합니다.
World Wide Web은 REST 원칙에 따라 설계된 시스템의 가장 유비쿼터스의 예입니다. 웹 브라우저는 웹 서버에서 호스팅되는 리소스에 액세스하는 클라이언트의 역할을 합니다. 리소스는 모든 웹 브라우저에서 사용할 수 있는 HTML 또는 XML 문법을 사용하여 표시됩니다. 또한 브라우저는 새 리소스에 대한 링크를 쉽게 따를 수 있습니다.
RESTful 시스템의 장점은 확장성이 높고 유연하다는 것입니다. 리소스가 4개의 HTTP 동사를 사용하여 액세스 및 조작되므로 리소스는 URI를 사용하여 노출되고 리소스는 표준 문법을 사용하여 표현되므로 클라이언트는 서버 변경의 영향을 받지 않습니다. 또한 RESTful 시스템은 캐싱 및 프록시와 같은 HTTP의 확장성 기능을 최대한 활용할 수 있습니다.
45.2. 기본 REST 원칙
RESTful 아키텍처는 다음과 같은 기본 원칙을 준수합니다.
- 애플리케이션 상태 및 기능은 리소스로 나뉩니다.
- 리소스는 하이퍼 미디어 링크로 사용할 수 있는 표준 URI를 사용하여 주소 지정할 수 있습니다.
모든 리소스는 4개의 HTTP 동사만 사용합니다.
-
DELETE
-
GET
-
POST
-
PUT
-
- 모든 리소스는 HTTP에서 지원하는 MIME 유형을 사용하여 정보를 제공합니다.
- 프로토콜은 상태 비저장입니다.
- 응답은 캐시할 수 있습니다.
- 프로토콜이 계층화됩니다.
45.3. Resources
리소스는 REST의 핵심입니다. 리소스는 URI를 사용하여 처리할 수 있는 정보의 소스입니다. 웹 초기에는 리소스가 주로 정적 문서였습니다. 최신 웹에서 리소스는 모든 정보 소스가 될 수 있습니다. 예를 들어 웹 서비스는 URI를 사용하여 액세스할 수 있는 리소스일 수 있습니다.
RESTful 끝점은 주소 있는 리소스의 표현을 교환합니다. 표현은 리소스에서 제공하는 데이터를 포함하는 문서입니다. 예를 들어 고객 레코드에 대한 액세스를 제공하는 웹 서비스의 방법은 리소스와 서비스 간에 교환되는 고객 레코드의 사본은 리소스를 나타냅니다.
45.4. REST 모범 사례
RESTful 웹 서비스를 설계할 때 다음 사항을 염두에 두는 것이 좋습니다.
노출하려는 각 리소스에 대해 고유한 URI를 제공합니다.
예를 들어, 드라이브 레코드를 처리하는 시스템을 구축하는 경우 각 레코드에는 고유한 URI가 있어야 합니다. 또한 시스템이 다운로딩 위반 및 과속도에 대한 정보를 제공하는 경우 각 유형의 리소스도 고유한 기반을 보유해야 합니다. 예를 들어, 속도 운임은 /speedingfines/driverID 를 통해 접근할 수 있고, 타이핑 위반은 /parkingfines/driverID 를 통해 접근할 수 있습니다.
URI에 nouns를 사용합니다.
nouns를 사용하면 리소스가 작업이 아닌 리소스가 있다는 사실을 강조합니다. /ordering 과 같은 URI는 작업을 의미하지만 /order는 작업을 의미합니다.
-
GET
에 매핑되는 메서드는 데이터를 변경하지 않아야 합니다. 응답에서 링크를 사용하십시오.
응답에 다른 리소스에 대한 링크를 배치하면 클라이언트가 데이터 체인을 더 쉽게 추적할 수 있습니다. 예를 들어 서비스에서 리소스 컬렉션을 반환하는 경우 클라이언트가 제공된 링크를 사용하여 각 개별 리소스에 더 쉽게 액세스할 수 있습니다. 링크가 포함되지 않은 경우 클라이언트는 특정 노드로 체인을 따르기 위해 추가 논리가 있어야 합니다.
서비스를 상태 비저장으로 설정합니다.
상태 정보를 유지하기 위해 클라이언트 또는 서비스를 요구하면 둘 사이의 긴밀한 결합이 강제 적용됩니다. 긴밀한 결합으로 인해 업그레이드 및 마이그레이션이 더 어려워집니다. 상태를 유지하면 통신 오류로부터 복구를 더 어렵게 만들 수 있습니다.
45.5. RESTful 웹 서비스 설계
RESTful 웹 서비스를 구현하는 데 사용하는 프레임워크에 관계없이 따라야 하는 여러 단계가 있습니다.
서비스에서 노출할 리소스를 정의합니다.
일반적으로 서비스는 트리로 구성된 하나 이상의 리소스를 노출합니다. 예를 들어 구동 레코드 서비스는 다음 세 가지 리소스로 구성할 수 있습니다.
- /license/driverID
- /license/driverID/speedingfines
- /license/driverID/parkingfines
각 리소스에서 수행할 수 있는 작업을 정의합니다.
예를 들어, 다이버의 주소를 업데이트하거나 운전기사 기록에서 공원 티켓을 제거할 수 있어야 합니다.
- 작업을 적절한 HTTP 동사에 매핑합니다.
서비스를 정의하면 Apache CXF를 사용하여 구현할 수 있습니다.
45.6. Apache CXF를 사용하여 REST 구현
Apache CXF는 RESTFul Web Services(JAX-RS)를 위한 Java API구현을 제공합니다. Cryostat-RS는 주석을 사용하여 Cryostat를 리소스에 매핑하는 표준화된 방법을 제공합니다.
abstract 서비스 정의에서 Cryostat-RS를 사용하여 구현된 RESTful 웹 서비스로 이동하는 경우 다음을 수행해야 합니다.
서비스 리소스 트리의 최상위를 나타내는 리소스에 대한 루트 리소스 클래스를 생성합니다.
46.3절. “루트 리소스 클래스”을 참조하십시오.
서비스의 기타 리소스를 하위 리소스에 매핑합니다.
46.5절. “하위 리소스 작업”을 참조하십시오.
각 리소스에서 사용하는 각 HTTP 동사를 구현하는 방법을 생성합니다.
46.4절. “리소스 메서드 작업”을 참조하십시오.
Apache CXF는 Java 인터페이스를 RESTful 웹 서비스에 매핑하기 위해 이전 HTTP 바인딩을 계속 지원합니다. HTTP 바인딩은 기본 기능을 제공하며 여러 가지 제한이 있습니다. 개발자는 Cryostat-RS를 사용하도록 애플리케이션을 업데이트하는 것이 좋습니다.
45.7. 데이터 바인딩
기본적으로 Apache CXF는 JAXB(Java Architecture for XML Binding) 개체를 사용하여 리소스 및 해당 표현을 Java 오브젝트에 매핑합니다. Java 개체와 XML 요소 간의 깔끔하고 잘 정의된 매핑을 제공합니다.
Apache CXF Cryostat-RS 구현에서는 JSON( JavaScript Object Notation )을 사용하여 데이터 교환도 지원합니다. JSON은 Cryostat 개발자가 사용하는 일반적인 데이터 형식입니다. JSON과 CryostatB 간의 데이터 마샬링은 Apache CXF 런타임에서 처리합니다.