1. 소개

JAX-RS (RESTful 웹 서비스용 Java API)는 REST API 작성을 지원하는 Java API 세트입니다 . 그리고 프레임워크는 어노테이션을 잘 활용하여 이러한 API의 개발 및 배포를 단순화합니다.

이 사용방법(예제)에서는 간단한 RESTful 웹 서비스를 만들기 위해 JAX-RS 사양의 이식 가능한 구현을 제공하는 JBoss인 RESTEasy를 사용합니다.

2. 프로젝트 설정

두 가지 가능한 시나리오를 고려합니다.

  • 독립 실행형 설정 - 모든 애플리케이션 서버에서 작동하도록 고안되었습니다.
  • JBoss AS 설정 – JBoss AS에 배포하는 경우에만 고려

2.1. 독립형 설정

독립 실행형 설정으로 JBoss WildFly 10 을 사용하여 시작하겠습니다 .

JBoss WildFly 10은 RESTEasy 버전 3.0.11과 함께 제공되지만 보시다시피 새 3.0.14 버전으로 pom.xml 을 구성합니다.

그리고 resteasy-servlet-initializer 덕분에 RESTEasy는 ServletContainerInitializer 통합 인터페이스 를 통해 독립 실행형 Servlet 3.0 컨테이너와의 통합을 제공합니다.

pom.xml 을 살펴보겠습니다 .

<properties>
    <resteasy.version>3.0.14.Final</resteasy.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-servlet-initializer</artifactId>
        <version>${resteasy.version}</version>
    </dependency>
    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-client</artifactId>
        <version>${resteasy.version}</version>
    </dependency>
</dependencies>

jboss-deployment-structure.xml

JBoss 내에서 WAR, JAR 또는 EAR로 배포되는 모든 것은 모듈입니다. 이러한 모듈을 동적 모듈 이라고 합니다 .

이 외에도 $JBOSS_HOME/modules 에는 몇 가지 정적 모듈 이 있습니다 . JBoss에는 RESTEasy 정적 모듈 이 있으므로 독립 실행형 배포의 경우 일부를 제외 하려면 jboss-deployment-structure.xml 이 필수입니다.

이러한 방식으로 WAR 에 포함된 모든 클래스와 JAR 파일 이 로드됩니다.

<jboss-deployment-structure>
    <deployment>
        <exclude-subsystems>
            <subsystem name="resteasy" />
        </exclude-subsystems>
        <exclusions>
            <module name="javaee.api" />
            <module name="javax.ws.rs.api"/>
            <module name="org.jboss.resteasy.resteasy-jaxrs" />
        </exclusions>
        <local-last value="true" />
    </deployment>
</jboss-deployment-structure>

2.2. 설치로서의 JBoss

JBoss 버전 6 이상에서 RESTEasy를 실행하려는 경우 애플리케이션 서버에 이미 번들로 포함된 라이브러리를 채택하도록 선택하여 pom을 단순화할 수 있습니다.

<dependencies>
    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jaxrs</artifactId>
        <version>${resteasy.version}</version>
    </dependency>
<dependencies>

jboss -deployment-structure.xml 은 더 이상 필요하지 않습니다.

3. 서버 측 코드

3.1. 서블릿 버전 3 web.xml

이제 간단한 프로젝트의 web.xml을 간단히 살펴보겠습니다.

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
     http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

   <display-name>RestEasy Example</display-name>

   <context-param>
      <param-name>resteasy.servlet.mapping.prefix</param-name>
      <param-value>/rest</param-value>
   </context-param>

</web-app>

resteasy.servlet.mapping.prefix 는 API 애플리케이션에 대한 상대 경로를 추가하려는 경우에만 필요합니다.

이 시점에서 resteasy servlet-initializerpom.xml 에 의존성으로 추가 되었기 때문에 web.xml 에 서블릿선언하지 않았다는 점에 주목하는 것이 매우 중요합니다 . 그 이유는 – RESTEasy는 javax.server.ServletContainerInitializer 를 구현하는 org.jboss.resteasy.plugins.servlet.ResteasyServletInitializer 클래스를 제공합니다 .

ServletContainerInitializer 는 이니셜라이저이며 서블릿 컨텍스트가 준비되기 전에 실행됩니다. 이 이니셜라이저를 사용하여 앱의 서블릿, 필터 또는 리스너를 정의할 수 있습니다.

3.2. 애플리케이션 클래스

javax.ws.rs.core.Application 클래스 는 배포에 대한 정보를 제공하기 위해 구현할 수 있는 표준 JAX-RS 클래스입니다.

@ApplicationPath("/rest")
public class RestEasyServices extends Application {

    private Set<Object> singletons = new HashSet<Object>();

    public RestEasyServices() {
        singletons.add(new MovieCrudService());
    }

    @Override
    public Set<Object> getSingletons() {
        return singletons;
    }
}

보시다시피 – 이것은 단순히 모든 JAX-RS 루트 리소스 및 Provider를 나열하는 클래스이며 @ApplicationPath 어노테이션으로 어노테이션이 추가됩니다.

클래스 및 싱글톤별로 빈 세트를 리턴하면 JAX-RS 어노테이션 자원 및 제공자 클래스에 대해 WAR이 스캔됩니다.

3.3. 서비스 구현 클래스

마지막으로 여기에서 실제 API 정의를 살펴보겠습니다.

@Path("/movies")
public class MovieCrudService {

    private Map<String, Movie> inventory = new HashMap<String, Movie>();

    @GET
    @Path("/getinfo")
    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
    public Movie movieByImdbId(@QueryParam("imdbId") String imdbId) {
        if (inventory.containsKey(imdbId)) {
            return inventory.get(imdbId);
        } else {
            return null;
        }
    }

    @POST
    @Path("/addmovie")
    @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
    public Response addMovie(Movie movie) {
        if (null != inventory.get(movie.getImdbId())) {
            return Response
              .status(Response.Status.NOT_MODIFIED)
              .entity("Movie is Already in the database.").build();
        }

        inventory.put(movie.getImdbId(), movie);
        return Response.status(Response.Status.CREATED).build();
    }
}

4. 결론

이 빠른 사용방법(예제)에서는 RESTEasy를 소개하고 매우 간단한 API를 구축했습니다.

이 문서에서 사용된 예제는 GitHub에서 샘플 프로젝트 로 사용할 수 있습니다 .

REST footer banner