46.5. 하위 리소스 작업
46.5.1. 개요
둘 이상의 리소스에서 서비스를 처리해야 하는 경우가 많습니다. 예를 들어 주문 처리 서비스에서 모범 사례에서는 각 고객이 고유한 리소스로 처리된다고 제안합니다. 각 주문은 고유한 리소스로도 처리됩니다.
JAX-RS API를 사용하여 고객 리소스 및 주문 리소스를 하위 리소스로 구현합니다. 하위 리소스는 root 리소스 클래스를 통해 액세스하는 리소스입니다. 리소스 클래스의 메서드에 @Path
주석을 추가하여 정의합니다. 하위 리소스는 다음 두 가지 방법 중 하나로 구현할 수 있습니다.
- 하위 리소스 메서드- 하위 리소스에 대한 HTTP 동사를 직접 구현하고 “HTTP 동사 지정” 에 설명된 주석 중 하나로 장식됩니다.
- 하위 리소스 locator- 하위 리소스를 구현하는 클래스를 가리킵니다.
46.5.2. 하위 리소스 지정
하위 리소스는 @Path
주석으로 메서드를 장식하여 지정됩니다. 하위 리소스의 URI는 다음과 같이 구성됩니다.
하위 리소스의
@Path
주석 값을 하위 리소스의 상위 리소스의@Path
주석 값에 추가합니다.상위 리소스의
@Path
주석은 하위 리소스가 포함된 클래스의 오브젝트를 반환하는 리소스 클래스의 메서드에 있을 수 있습니다.- 루트 리소스에 도달할 때까지 이전 단계를 반복합니다.
- 어셈블된 URI는 서비스가 배포되는 기본 URI에 추가됩니다.
예를 들어 예 46.6. “주문 하위 리소스” 에 표시된 하위 리소스의 URI는 baseURI/customerservice/order/12 일 수 있습니다.
예 46.6. 주문 하위 리소스
... @Path("/customerservice/") public class CustomerService { ... @Path("/orders/{orderId}/") @GET public Order getOrder(@PathParam("orderId") String orderId) { ... } }
46.5.3. 하위 리소스 방법
하위 리소스 방법은 @Path
주석과 HTTP 동사 주석 중 하나로 장식됩니다. 하위 리소스 메서드는 지정된 HTTP 동사를 사용하여 리소스에 대한 요청을 직접 처리합니다.
예 46.7. “하위 리소스 방법” 세 가지 하위 리소스 메서드가 있는 리소스 클래스를 표시합니다.
-
getOrder()
는 URI가 /customerservice/orders/{orderId}/ 와 일치하는 리소스에 대한 HTTPGET
요청을 처리합니다. -
updateOrder()
는 URI가 /customerservice/orders/{orderId}/ 와 일치하는 리소스에 대한 HTTPPUT
요청을 처리합니다. -
newOrder()
는 /customerservice/orders/ 에서 리소스에 대한 HTTPPOST
요청을 처리합니다.
예 46.7. 하위 리소스 방법
... @Path("/customerservice/") public class CustomerService { ... @Path("/orders/{orderId}/") @GET public Order getOrder(@PathParam("orderId") String orderId) { ... } @Path("/orders/{orderId}/") @PUT public Order updateOrder(@PathParam("orderId") String orderId, Order order) { ... } @Path("/orders/") @POST public Order newOrder(Order order) { ... } }
동일한 URI 템플릿을 사용하는 하위 리소스 메서드는 하위 리소스 로케이터에서 반환된 리소스 클래스와 동일합니다.
46.5.4. 하위 리소스 검색기
하위 리소스 로케이터는 HTTP 동사 주석 중 하나로 장식되지 않으며 직접 처리하지 않도록 하위 리소스에 대한 요청입니다. 대신 하위 리소스 로케이터는 요청을 처리할 수 있는 리소스 클래스의 인스턴스를 반환합니다.
HTTP 동사 주석이 없는 경우 하위 리소스 로케이터도 엔터티 매개 변수를 가질 수 없습니다. 하위 리소스 로케이터 메서드에서 사용하는 모든 매개변수는 47장. 리소스 클래스 및 메서드에 정보 전달 에 설명된 주석 중 하나를 사용해야 합니다.
예 46.8. “하위 리소스 검색기에서 특정 클래스를 반환” 에 표시된 대로 하위 리소스 로케이터를 사용하면 모든 메서드를 하나의 슈퍼 클래스에 두는 대신 리소스를 재사용 가능한 클래스로 캡슐화할 수 있습니다. processOrder()
메서드는 하위 리소스 로케이터입니다. URI 템플릿 /orders/{orderId}/ 에 일치하는 URI에서 요청이 생성되면 Order
클래스의 인스턴스를 반환합니다. Order
클래스에는 HTTP 동사 주석으로 장식되는 메서드가 있습니다. PUT
요청은 updateOrder()
메서드에서 처리합니다.
예 46.8. 하위 리소스 검색기에서 특정 클래스를 반환
... @Path("/customerservice/") public class CustomerService { ... @Path("/orders/{orderId}/") public Order processOrder(@PathParam("orderId") String orderId) { ... } ... } public class Order { ... @GET public Order getOrder(@PathParam("orderId") String orderId) { ... } @PUT public Order updateOrder(@PathParam("orderId") String orderId, Order order) { ... } }
하위 리소스 로케이터는 런타임에 처리되어 다형성(polymorphism)을 지원할 수 있습니다. 하위 리소스 로케이터의 반환 값은 일반 오브젝트
, 추상 클래스 또는 클래스 계층 구조의 최상위가 될 수 있습니다. 예를 들어, PayPal 주문 및 신용 카드 주문을 모두 처리하는 데 필요한 서비스가 있는 경우 예 46.8. “하위 리소스 검색기에서 특정 클래스를 반환” 의 processOrder()
방법은 변경되지 않을 수 있습니다. ppOrder
및 ccOder
라는 두 개의 클래스를 구현해야 합니다. 이 클래스는 Order
클래스를 확장했습니다. processOrder()
구현에서는 필요한 논리에 따라 필요한 하위 리소스의 구현을 인스턴스화합니다.