4장. REST 서비스 정의
초록
Apache Camel은 REST 서비스를 정의하는 여러 방법을 지원합니다. 특히 Apache Camel은 REST DSL(Domain Specific Language)을 제공합니다. 이는 REST 구성 요소를 통해 계층화할 수 있고 OpenAPI 와의 통합을 제공하는 간단하면서도 강력한 fluent API입니다.
4.1. Camel의 REST 개요
4.1.1. 개요
Apache Camel은 Camel 애플리케이션에서 REST 서비스를 정의하기 위한 다양한 접근 방식과 구성 요소를 제공합니다. 이 섹션에서는 이러한 다양한 접근 방식과 구성 요소에 대한 간략한 개요를 제공하여 요구 사항에 가장 적합한 구현 및 API를 결정할 수 있습니다.
4.1.2. REST는 무엇입니까?
REST( Representational State Transfer )는 GET
,POST
,PUT
, DELETE
의 네 가지 기본 HTTP 동사만 사용하여 HTTP를 통해 데이터 전송을 중심으로 하는 분산 애플리케이션을 위한 아키텍처입니다.
HTTP를#159 메시지의 전송 프로토콜로 처리하는 Cryostat와 같은 프로토콜과 달리 REST 아키텍처는 HTTP를 직접 사용합니다. 주요 통찰력은 몇 가지 간단한 규칙에 의해 보강된 HTTP 프로토콜 자체는 분산 애플리케이션의 프레임워크 역할을 수행하기에 매우 적합합니다.
4.1.3. 샘플 REST 호출
REST 아키텍처는 표준 HTTP 동사를 기반으로 빌드되므로 대부분의 경우 일반 브라우저를 REST 클라이언트로 사용할 수 있습니다. 예를 들어 호스트와 포트 localhost:9091
에서 실행되는 간단한 Hello World REST 서비스를 호출하려면 브라우저에서 다음과 같은 URL로 이동할 수 있습니다.
http://localhost:9091/say/hello/Garp
그런 다음 Hello World REST 서비스는 다음과 같은 응답 문자열을 반환할 수 있습니다.
Hello Garp
브라우저 창에 표시됩니다. 표준 브라우저(또는 curl
명령줄 유틸리티)를 사용하지 않고 REST 서비스를 쉽게 호출할 수 있는 것은 REST 프로토콜이 빠르게 인기를 얻는 많은 이유 중 하나입니다.
4.1.4. REST 래퍼 계층
다음 REST 래퍼 계층은 REST 서비스를 정의하는 간단한 구문을 제공하며 다양한 REST 구현에 계층화할 수 있습니다.
- REST DSL
REST DSL(
camel-core
)은 REST 서비스를 정의하는 간소화된 빌더 API를 제공하는 facade 또는 래퍼 계층입니다. REST DSL은 자체적으로 REST 구현을 제공하지 않습니다. 기본 REST 구현과 결합해야 합니다. 예를 들어 다음 Java 코드는 REST DSL을 사용하여 간단한 Hello World 서비스를 정의하는 방법을 보여줍니다.rest("/say") .get("/hello/{name}").route().transform().simple("Hello ${header.name}");
자세한 내용은 4.2절. “REST DSL을 사용하여 서비스 정의” 에서 참조하십시오.
- rest 구성 요소
Rest 구성 요소(
camel-core
)는 URI 구문을 사용하여 REST 서비스를 정의할 수 있는 래퍼 계층입니다. REST DSL과 마찬가지로 Rest 구성 요소는 자체적으로 REST 구현을 제공하지 않습니다. 기본 REST 구현과 결합해야 합니다.HTTP 전송 구성 요소를 명시적으로 구성하지 않으면 REST DSL은 classpath에서 사용 가능한 구성 요소를 확인하여 사용할 HTTP 구성 요소를 자동으로 검색합니다. REST DSL은 모든 HTTP 구성 요소의 기본 이름을 찾고 찾은 첫 번째 구성 요소를 사용합니다. classpath에 HTTP 구성 요소가 없고 HTTP 전송을 명시적으로 구성하지 않은 경우 기본 HTTP 구성 요소는
camel-http
입니다.참고Camel 2.18에서 사용할 HTTP 구성 요소를 자동으로 검색하는 기능 Camel 2.17에서는 사용할 수 없습니다.
다음 Java 코드는 camel-rest 구성 요소를 사용하여 간단한 Hello World 서비스를 정의하는 방법을 보여줍니다.
from("rest:get:say:/hello/{name}").transform().simple("Hello ${header.name}");
4.1.5. REST 구현
Apache Camel은 다음 구성 요소를 통해 다양한 REST 구현을 제공합니다.
- Spark-Rest 구성 요소
Spark-Rest 구성 요소(
camel-spark-rest
)는 URI 구문을 사용하여 REST 서비스를 정의할 수 있는 REST 구현입니다. Spark 프레임워크 자체는 Sinatra 프레임워크(Python API)를 기반으로 하는 Java API입니다. 예를 들어 다음 Java 코드는 Spark-Rest 구성 요소를 사용하여 간단한 Hello World 서비스를 정의하는 방법을 보여줍니다.from("spark-rest:get:/say/hello/:name").transform().simple("Hello ${header.name}");
Rest 구성 요소와 달리 URI의 변수 구문은
{name}
대신:name
}입니다.참고Spark-Rest 구성 요소에는 Java 8이 필요합니다.
- Restlet 구성 요소
Restlet 구성 요소(
camel-restlet
)는 기본적으로 서로 다른 전송 프로토콜 위에 계층화할 수 있는 REST 구현입니다(이 구성 요소는 HTTP 프로토콜에 대해서만 테스트됨). 또한 이 구성 요소는 Java에서 REST 서비스를 개발하기 위한 상용 프레임워크인 Restlet Framework 와의 통합을 제공합니다. 예를 들어 다음 Java 코드는 Restlet 구성 요소를 사용하여 간단한 Hello World 서비스를 정의하는 방법을 보여줍니다.from("restlet:http://0.0.0.0:9091/say/hello/{name}?restletMethod=get") .transform().simple("Hello ${header.name}");
자세한 내용은 Apache Camel 구성 요소 참조 가이드의 Restlet 을 참조하십시오.
- 서블릿 구성 요소
Servlet 구성 요소(
camel-servlet
)는 Java 서블릿을 Camel 경로에 바인딩하는 구성 요소입니다. 즉, Servlet 구성 요소를 사용하면 표준 Java 서블릿인 것처럼 Camel 경로를 패키징하고 배포할 수 있습니다. 따라서 서블릿 구성 요소는 서블릿 컨테이너(예: Apache Tomcat HTTP 서버 또는 JBoss Enterprise Application Platform 컨테이너) 내에 Camel 경로를 배포해야 하는 경우 특히 유용합니다.그러나 서블릿 구성 요소는 자체적으로 REST 서비스를 정의하기 위한 편리한 REST API를 제공하지 않습니다. 따라서 서블릿 구성 요소를 사용하는 가장 쉬운 방법은 사용자 친화적인 API로 REST 서비스를 정의할 수 있도록 REST DSL과 결합하는 것입니다.
자세한 내용은 Apache Camel 구성 요소 참조 가이드의 Servlet 을 참조하십시오.
4.1.6. Cryostat-RS REST 구현
Cryostat -RS ( RESTful Web Services에 대한 Java API)는 REST 요청을 Java 오브젝트에 바인딩하기 위한 프레임워크입니다. 이 프레임워크는 바인딩을 정의하기 위해 Java 클래스를 Cryostat-RS 주석으로 데코레이팅해야 합니다. Cryostat-RS 프레임워크는 비교적 성숙하며 REST 서비스 개발을 위한 정교한 프레임워크를 제공하지만, 프로그래밍은 다소 복잡합니다.
Apache Camel과의 Cryostat-RS 통합은 Apache CXF를 통해 계층화된 CXFRS 구성 요소에 의해 구현됩니다. 개요에서 Cryostat-RS는 다음 주석을 사용하여 Java 클래스에 REST 요청을 바인딩합니다. 이 주석은 사용 가능한 많은 주석의 불완전한 샘플일 뿐입니다.
- @Path
- Java 클래스에 컨텍스트 경로를 매핑하거나 하위 경로를 특정 Java 메서드에 매핑할 수 있는 주석입니다.
- @GET, @POST, @PUT, @DELETE
- HTTP 메서드를 Java 메서드에 매핑하는 주석입니다.
- @PathParam
- URI 매개변수를 Java 메서드 인수에 매핑하는 주석 또는 URI 매개변수를 필드에 삽입합니다.
- @QueryParam
- 쿼리 매개변수를 Java 메서드 인수에 매핑하는 주석 또는 쿼리 매개변수를 필드에 삽입합니다.
REST 요청 또는 REST 응답의 본문은 일반적으로 XML(190) 데이터 형식이어야 합니다. 그러나 Apache CXF는 JSON 메시지도 구문 분석할 수 있도록 JSON 형식으로 JSON 형식의 변환을 지원합니다.
자세한 내용은 Apache Camel 구성 요소 참조 가이드 및 Apache CXF 개발 가이드 의 CXFRS 를 참조하십시오.
CXFRS 구성 요소는 REST DSL과 통합 되지 않습니다.