45장. RESTful 웹 서비스 소개

초록

REST(Representational State Transfer)는 네 가지 기본 HTTP 동사만 사용하여 HTTP를 통한 데이터 전송을 중심으로 하는 소프트웨어 아키텍처 스타일입니다. 또한 SOAP 봉투 및 상태 데이터 사용과 같은 추가 래퍼를 사용하고 있습니다.

45.1. 개요

REST( Representational State Transfer )는 Roy Fielding이라는 연구자에 의해 의사 논문에서 처음으로 기술한 아키텍처 스타일입니다. RESTful 시스템에서 서버는 URI를 사용하여 리소스를 노출하고 클라이언트는 4개의 HTTP 동사를 사용하여 이러한 리소스에 액세스합니다. 클라이언트가 리소스 표시를 수신하면 상태가 됩니다. 일반적으로 링크를 따라 새 리소스에 액세스할 때 해당 상태를 변경하거나 전환합니다. REST는 작업을 수행하기 위해 광범위한 표준 grammar를 사용하여 리소스를 나타낼 수 있다고 가정합니다.

World Wide Web은 REST 원칙에 따라 설계된 시스템의 가장 유비쿼터스 예제입니다. 웹 브라우저는 웹 서버에서 호스팅되는 리소스에 액세스하는 클라이언트 역할을 합니다. 리소스는 모든 웹 브라우저에서 사용할 수 있는 HTML 또는 XML 문법을 사용하여 나타냅니다. 브라우저는 또한 쉽게 새로운 자원에 대한 링크를 따를 수 있습니다.

RESTful 시스템의 장점은 확장성이 높고 유연하다는 것입니다. 네 가지 HTTP 동사를 사용하여 리소스에 액세스하고 조작되므로 리소스가 URI를 사용하여 노출되고 리소스는 표준 grammars를 사용하여 표시되므로 클라이언트는 서버 변경에 의한 영향을 받지 않습니다. 또한 RESTful 시스템은 캐싱 및 프록시와 같은 HTTP의 확장성 기능을 최대한 활용할 수 있습니다.

45.2. 기본 REST 원칙

RESTful 아키텍처는 다음과 같은 기본 원칙을 준수합니다.

  • 애플리케이션 상태 및 기능은 리소스로 나뉩니다.
  • 리소스는 하이퍼 미디어 링크로 사용할 수 있는 표준 URI를 사용하여 해결할 수 있습니다.
  • 모든 리소스는 4개의 HTTP 동사만 사용합니다.

    • DELETE
    • GET
    • POST
    • PUT
  • 모든 리소스는 HTTP에서 지원하는 MIME 유형을 사용하여 정보를 제공합니다.
  • 프로토콜은 상태 비저장 방식입니다.
  • 응답은 캐시할 수 있습니다.
  • 프로토콜이 계층화되어 있습니다.

45.3. 리소스

리소스 는 REST의 핵심입니다. 리소스는 URI를 사용하여 처리할 수 있는 정보의 소스입니다. 웹 초기에는 리소스가 주로 정적 문서였습니다. 최신 웹에서 리소스는 모든 정보 소스가 될 수 있습니다. 예를 들어 웹 서비스는 URI를 사용하여 액세스할 수 있는 경우 리소스일 수 있습니다.

RESTful 엔드포인트는 주소를 처리하는 리소스를 나타냅니다. 표현은 리소스에서 제공하는 데이터를 포함하는 문서입니다. 예를 들어 고객 레코드에 대한 액세스를 제공하는 웹 서비스의 방법은 리소스이며 서비스와 소비자 간에 교환된 고객 레코드의 사본은 리소스를 나타냅니다.

45.4. REST 모범 사례

RESTful 웹 서비스를 설계할 때 다음 사항을 염두에 두는 것이 좋습니다.

  • 노출하려는 각 리소스에 대해 별도의 URI를 제공합니다.

    예를 들어 구동 레코드를 다루는 시스템을 구축하는 경우 각 레코드에는 고유한 URI가 있어야 합니다. 또한 시스템이 주차 위반 및 벌금에 대한 정보를 제공하는 경우, 각 리소스 유형에는 고유한 기반도 있어야 합니다. 예를 들어, 운이 빠른 벌금은 /speedingfines/driverID 및 주차 위반은 /parkingfines/driverID 를 통해 액세스 할 수 있습니다.

  • URI에 nouns를 사용합니다.

    nouns를 사용하면 리소스가 사물이며 작동하지 않음을 강조합니다. /ordering 과 같은 URI는 작업을 의미하지만 / 주문은 항목을 의미합니다.

  • GET 에 매핑되는 메서드는 데이터를 변경하지 않아야 합니다.
  • 귀하의 답변에 대한 링크를 사용하십시오.

    응답에 다른 리소스에 대한 링크를 배치하면 클라이언트가 데이터 체인을 더 쉽게 추적할 수 있습니다. 예를 들어 서비스에서 리소스 컬렉션을 반환하는 경우 클라이언트가 제공된 링크를 사용하여 각 개별 리소스에 더 쉽게 액세스할 수 있습니다. 링크가 포함되지 않은 경우 클라이언트에는 특정 노드에 체인을 따르려면 추가 논리가 필요합니다.

  • 서비스를 상태 비저장으로 설정합니다.

    클라이언트 또는 서비스가 상태 정보를 유지하도록 요구하면 둘 사이에 긴밀한 결합이 필요합니다. 긴밀한 결합으로 업그레이드 및 마이그레이션은 더욱 어려워집니다. 상태를 유지 관리하면 통신 오류로부터 복구도 더 어려워질 수 있습니다.

45.5. RESTful 웹 서비스 설계

RESTful 웹 서비스를 구현하는 데 사용하는 프레임워크와 관계없이 여러 단계를 따라야 합니다.

  1. 서비스에서 노출할 리소스를 정의합니다.

    일반적으로 서비스는 트리로 구성된 하나 이상의 리소스를 노출합니다. 예를 들어 운전 기록 서비스는 다음 세 가지 리소스로 구성할 수 있습니다.

    • /license/driverID
    • /license/driverID/speedingfines
    • /license/driverID/parkingfines
  2. 각 리소스에서 수행할 작업을 정의합니다.

    예를 들어, 다이버의 주소를 업데이트하거나 운전자 기록에서 주차 티켓을 제거할 수 있습니다.

  3. 작업을 적절한 HTTP 동사에 매핑합니다.

서비스를 정의한 후에는 Apache CXF를 사용하여 구현할 수 있습니다.

45.6. Apache CXF로 REST 구현

Apache CXF는 RESTFul Web Services(JAX-RS)에 대한 Java API구현을 제공합니다. JAX-RS는 주석을 사용하여 POJO를 리소스에 매핑하는 표준화된 방법을 제공합니다.

추상 서비스 정의에서 JAX-RS를 사용하여 구현된 RESTful 웹 서비스로 이동할 때 다음을 수행해야 합니다.

  1. 서비스의 리소스 트리의 최상위를 나타내는 리소스에 대한 루트 리소스 클래스를 생성합니다.

    46.3절. “루트 리소스 클래스” 을 참조하십시오.

  2. 서비스의 기타 리소스를 하위 리소스에 매핑합니다.

    46.5절. “하위 리소스 작업” 을 참조하십시오.

  3. 각 리소스에서 사용하는 각 HTTP 동사를 구현하는 메서드를 생성합니다.

    46.4절. “리소스 메서드 작업” 을 참조하십시오.

참고

Apache CXF는 Java 인터페이스를 RESTful 웹 서비스에 매핑하는 이전 HTTP 바인딩을 계속 지원합니다. HTTP 바인딩은 기본 기능을 제공하며 여러 가지 제한 사항이 있습니다. 개발자는 JAX-RS를 사용하도록 애플리케이션을 업데이트하는 것이 좋습니다.

45.7. 데이터 바인딩

기본적으로 Apache CXF는 Java Architecture for XML Binding (JAXB) 개체를 사용하여 리소스와 해당 표현을 Java 오브젝트에 매핑합니다. Java 개체와 XML 요소 간의 깔끔하고 잘 정의된 매핑을 제공합니다.

Apache CXF JAX-RS 구현에서는 JSON( JavaScript Object Notation )을 사용하여 데이터 교환도 지원합니다. JSON은 Ajax 개발자가 사용하는 인기 있는 데이터 형식입니다. JSON과 JAXB 간 데이터 마샬링은 Apache CXF 런타임에서 처리합니다.