Java Jersey 튜토리얼에 오신 것을 환영합니다. 최근에 JAX-RS Jersey 프레임워크를 사용하여 Restful 웹 서비스 프로젝트에 착수했습니다.
Java Jersey 프레임워크란 무엇인가요?
Java Jersey 프로젝트는 Java에서 Restful 웹 서비스를 생성하는 데 사용되는 JAX-RS API를 추적합니다.
1. 이 튜토리얼은 누구에게 도움이 될까요?
이 튜토리얼은 JAX-RS API와 JAXB를 사용하여 Restful 웹 서비스를 개발하고 배포하는 데 관심이 있는 Java 프로그래머를 대상으로 합니다.
2. 사전 요구사항
이 튜토리얼의 범위는 Jersey API를 사용하여 Restful 웹 서비스를 생성하고 Java 클라이언트 프로그램을 통해 웹 서비스를 호출하며 도구를 사용하여 웹 서비스를 테스트하는 것입니다. Java, 웹 서비스, XML, Maven 및 어떤 애플리케이션 서버 (JBoss/Tomcat)의 기본적인 이해도는 튜토리얼을 쉽게 이해하기 위해 필요합니다.
3. 소프트웨어 및 도구
- JDK 버전 1.8.0_131
- Apache Maven 3.5.3
- Mac OS X 10.13.4
- Tomcat 8.5.16
- Eclipse Java EE IDE Oxygen 4.7.3
Jersey Eclipse Maven 프로젝트 만들기
이클립스에서 “Dynamic Web Project”를 생성한 다음에 Maven 프로젝트로 변환합니다. 이렇게 하면 Maven 기반의 웹 응용 프로그램 기본 프로젝트가 제공됩니다. GroupId를 com.journaldev.jersey
로 지정했고 artifactID를 my-jersey-project
로 지정했지만 원하는 대로 지정할 수 있습니다. 프로젝트 개발을 완료하면 프로젝트 구조가 아래 이미지와 같이 보일 것입니다.
Java Jersey Restful 웹 서비스 프로젝트 설명
1. pom.xml: 프로젝트 구성 세부 정보입니다. jersey 종속성이 제공되었음을 유의하십시오. 다른 세부 정보는 비슷한 메이븐 프로젝트에 대해 일반적입니다.
<project xmlns="https://maven.apache.org/POM/4.0.0"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.journaldev.jersey</groupId>
<artifactId>my-jersey-project</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-server</artifactId>
<version>1.14</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-servlet</artifactId>
<version>1.14</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.14</version>
</dependency>
</dependencies>
<build>
<finalName>My-Jersey-Project</finalName>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<warSourceDirectory>WebContent</warSourceDirectory>
</configuration>
</plugin>
</plugins>
</build>
</project>
2. EmpRequest.java: 요청 객체를 위한 자바 빈입니다. 여기서 주목해야 할 중요한 점은 클래스를 XML 요소에 매핑하기 위한 @XmlRootElement
주석입니다.
package com.journaldev.model;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "empRequest")
public class EmpRequest {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3. EmpResponse.java: 응답 객체를 위한 자바 빈입니다.
package com.journaldev.model;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "empResponse")
public class EmpResponse {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
4. ErrorResponse.java: 예외 발생 시 응답으로 전송될 자바 빈입니다.
package com.journaldev.model;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "errorResponse")
public class ErrorResponse {
private String errorCode;
private int errorId;
public String getErrorCode() {
return errorCode;
}
public void setErrorCode(String errorCode) {
this.errorCode = errorCode;
}
public int getErrorId() {
return errorId;
}
public void setErrorId(int errorId) {
this.errorId = errorId;
}
}
5. EmpNotFoundException.java: 웹 서비스에서 발생하는 일반적인 예외 클래스입니다.
package com.journaldev.exception;
public class EmpNotFoundException extends Exception {
private static final long serialVersionUID = 4351720088030656859L;
private int errorId;
public int getErrorId() {
return errorId;
}
public EmpNotFoundException(String msg, int errorId) {
super(msg);
this.errorId = errorId;
}
public EmpNotFoundException(String msg, Throwable cause) {
super(msg, cause);
}
}
6. web.xml: 웹 서비스의 배포 서술자입니다. URI가 https://<HOST>:<PORT>/My-Jersey-Project/rest/*
인 요청은 Jersey ServletContainer 서블릿에 의해 처리됩니다. “com.sun.jersey.config.property.packages”에 전달된 init-param 값은 jersey가 웹 서비스 클래스를 찾을 패키지를 정의합니다. 이 속성은 리소스 클래스를 가리켜야 합니다. 또한 서브 패키지에서 리소스 클래스를 찾습니다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xmlns="https://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="https://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>My Jersey Project</display-name>
<!-- Jersey Servlet configurations -->
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.journaldev</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<!-- Jersey Servlet configurations -->
</web-app>
7. EmpRouter.java: 다양한 종류의 요청을 처리하는 리소스 클래스입니다.
- @Path(“/emp”) – URI가
https://<HOST>:<PORT>/My-Jersey-Project/rest/emp/
인 모든 요청은 이 리소스 클래스에 의해 처리됩니다. - @Path(“/getEmp”) – 모든 URI가
https://<HOST>:<PORT>/My-Jersey-Project/rest/emp/getEmp
인 요청은 이 메서드에서 처리됩니다. - @POST – 이 주석은 사용된 HTTP 메서드가 POST여야 함을 정의합니다. 다른 가능한 값으로는 @GET, @PUT, @DELETE
- @Consumes(MediaType.APPLICATION_XML) – 해당 메서드는 XML 요소를 허용합니다
- @Produces(MediaType.APPLICATION_XML) – 해당 메서드는 XML 요소를 반환합니다
package com.journaldev.router;
import com.journaldev.exception.EmpNotFoundException;
import com.journaldev.model.*;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.xml.bind.JAXBElement;
@Path("/emp")
public class EmpRouter {
@POST
@Path("/getEmp")
@Consumes(MediaType.APPLICATION_XML)
@Produces(MediaType.APPLICATION_XML)
public Response getEmp(JAXBElement<EmpRequest> empRequest)
throws EmpNotFoundException {
EmpResponse empResponse = new EmpResponse();
if (empRequest.getValue().getId() == 1) {
empResponse.setId(empRequest.getValue().getId());
empResponse.setName(empRequest.getValue().getName());
} else {
throw new EmpNotFoundException("Wrong ID", empRequest.getValue()
.getId());
}
return Response.ok(empResponse).build();
}
}
8. EmpNotFoundExceptionMapper.java: EmpNotFoundException을 Response 객체로 매핑하는 예외 매퍼 클래스입니다. 이 클래스에는 @Provider 주석이 있어야 합니다. 이 클래스는 web.xml에서 리소스 클래스용으로 제공된 패키지에 있어야 합니다. toResponse()
메서드의 구현은 ErrorResponse 객체를 생성하고 상태를 INTERNAL_SERVER_ERROR로 설정하여 Response 객체의 Entity로 설정합니다.
package com.journaldev.exceptionmapper;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
import com.journaldev.exception.EmpNotFoundException;
import com.journaldev.model.ErrorResponse;
@Provider
public class EmpNotFoundExceptionMapper implements
ExceptionMapper<EmpNotFoundException> {
public EmpNotFoundExceptionMapper() {
}
public Response toResponse(
EmpNotFoundException empNotFoundException) {
ErrorResponse errorResponse = new ErrorResponse();
errorResponse.setErrorId(empNotFoundException.getErrorId());
errorResponse.setErrorCode(empNotFoundException.getMessage());
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(
errorResponse).type(
MediaType.APPLICATION_XML).build();
}
}
웹 서비스가 준비되었습니다. WAR 파일을 생성하고 애플리케이션 서버에 배포하십시오.
Jersey Client Example
Jersey Client를 사용하여 웹 서비스를 호출하고 응답을 프로그래밍 방식으로 가져올 수 있습니다. EmpClient.java: 이것은 웹 서비스를 호출하는 샘플 Java 프로그램으로, Jersey Client API를 사용하여 서비스를 호출하고 응답 상태에 따라 응답 엔터티를 EmpResponse 또는 ErrorResponse 클래스로 구문 분석합니다.
package com.journaldev.client;
import javax.ws.rs.core.MediaType;
import com.journaldev.model.EmpRequest;
import com.journaldev.model.EmpResponse;
import com.journaldev.model.ErrorResponse;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
public class EmpClient {
/**
* @param args
*/
public static void main(String[] args) {
String uri = "https://localhost:8080/My-Jersey-Project/rest/emp/getEmp";
EmpRequest request = new EmpRequest();
// ID를 1로 설정하여 OK 응답
request.setId(2);
request.setName("PK");
try {
Client client = Client.create();
WebResource r = client.resource(uri);
ClientResponse response = r.type(MediaType.APPLICATION_XML).post(ClientResponse.class, request);
System.out.println(response.getStatus());
if (response.getStatus() == 200) {
EmpResponse empResponse = response.getEntity(EmpResponse.class);
System.out.println(empResponse.getId() + "::" + empResponse.getName());
} else {
ErrorResponse exc = response.getEntity(ErrorResponse.class);
System.out.println(exc.getErrorCode());
System.out.println(exc.getErrorId());
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
성공 응답 오류 응답
요약
이 게시물에서는 Jersey API를 사용하여 REST 웹 서비스를 생성하는 방법을 배웠습니다. 또한 Java 프로그램을 통해 REST API를 호출하는 Jersey Client를 살펴보았습니다.
전체 프로젝트 코드는 GitHub 저장소에서 확인할 수 있습니다.
Source:
https://www.digitalocean.com/community/tutorials/jersey-java-tutorial