46.5. 하위 리소스 작업
46.5.1. 개요
두 개 이상의 리소스에서 서비스를 처리해야 할 가능성이 있습니다. 예를 들어 주문 처리 서비스에서 모범 사례에서는 각 고객이 고유한 리소스로 처리되도록 제안합니다. 각 순서는 고유한 리소스로 처리됩니다.
Cryostat-RS API를 사용하여 고객 리소스 및 주문 리소스를 하위 리소스로 구현합니다. 하위 리소스는 루트 리소스 클래스를 통해 액세스하는 리소스입니다. 리소스 클래스의 메서드에 @Path
주석을 추가하여 정의합니다. 하위 리소스는 다음 두 가지 방법 중 하나로 구현할 수 있습니다.
- 하위 리소스 메서드- 하위 리소스에 대한 HTTP 동사를 직접 구현하고 “HTTP 동사 지정” 에 설명된 주석 중 하나로 장식됩니다.
- 하위 리소스 -하위 리소스를 구현하는 클래스를 가리킵니다.
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) { ... } }
하위 리소스는 런타임 시 처리되므로 다형성을 지원할 수 있습니다. 하위 리소스의 반환 값은 일반 개체
, 추상 클래스 또는 클래스 계층 구조의 최상위일 수 있습니다. 예를 들어, 귀하의 서비스가 JWT 주문 및 신용카드 주문을 처리하는 데 필요한 경우 예 46.8. “특정 클래스를 반환하는 하위 리소스” 에서 processOrder()
메서드의 서명은 변경되지 않은 상태로 유지될 수 있습니다. Order
클래스를 확장한 두 개의 클래스 ppOrder
및 ccOder
를 구현해야 합니다. processOrder()
의 구현은 필요한 논리에 따라 원하는 하위 리소스 구현을 인스턴스화합니다.