46.5. 하위 리소스 작업

46.5.1. 개요

둘 이상의 리소스에서 서비스를 처리해야 하는 경우가 많습니다. 예를 들어 주문 처리 서비스에서 모범 사례에서는 각 고객이 고유한 리소스로 처리된다고 제안합니다. 각 주문은 고유한 리소스로도 처리됩니다.

JAX-RS API를 사용하여 고객 리소스 및 주문 리소스를 하위 리소스로 구현합니다. 하위 리소스는 root 리소스 클래스를 통해 액세스하는 리소스입니다. 리소스 클래스의 메서드에 @Path 주석을 추가하여 정의합니다. 하위 리소스는 다음 두 가지 방법 중 하나로 구현할 수 있습니다.

46.5.2. 하위 리소스 지정

하위 리소스는 @Path 주석으로 메서드를 장식하여 지정됩니다. 하위 리소스의 URI는 다음과 같이 구성됩니다.

  1. 하위 리소스의 @Path 주석 값을 하위 리소스의 상위 리소스의 @Path 주석 값에 추가합니다.

    상위 리소스의 @Path 주석은 하위 리소스가 포함된 클래스의 오브젝트를 반환하는 리소스 클래스의 메서드에 있을 수 있습니다.

  2. 루트 리소스에 도달할 때까지 이전 단계를 반복합니다.
  3. 어셈블된 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}/ 와 일치하는 리소스에 대한 HTTP GET 요청을 처리합니다.
  • updateOrder() 는 URI가 /customerservice/orders/{orderId}/ 와 일치하는 리소스에 대한 HTTP PUT 요청을 처리합니다.
  • newOrder()/customerservice/orders/ 에서 리소스에 대한 HTTP POST 요청을 처리합니다.

예 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() 방법은 변경되지 않을 수 있습니다. ppOrderccOder 라는 두 개의 클래스를 구현해야 합니다. 이 클래스는 Order 클래스를 확장했습니다. processOrder() 구현에서는 필요한 논리에 따라 필요한 하위 리소스의 구현을 인스턴스화합니다.