Java의 편안한 웹 서비스 자습서
Java의 편안한 웹 서비스 자습서에 오신 것을 환영합니다. REST는 REpresentational State Transfer의 약자입니다. REST는 네트워크를 통해 액세스할 수 있는 애플리케이션을 개발하기 위한 아키텍처 스타일입니다. REST 건축 양식은 Roy Fielding이 2000년 박사 학위 논문에서 조명했습니다.
편안한 웹 서비스
편안한 웹 서비스는 웹 서비스가 리소스이고 해당 URI로 식별될 수 있는 상태 비저장 클라이언트-서버 아키텍처입니다. REST 클라이언트 애플리케이션은 HTTP GET/POST 메서드를 사용하여 Restful 웹 서비스를 호출할 수 있습니다. REST는 사용할 특정 프로토콜을 지정하지 않지만 거의 모든 경우에 HTTP/HTTPS를 통해 사용됩니다. SOAP 웹 서비스와 비교할 때 이들은 가볍고 표준을 따르지 않습니다. 요청 및 응답에 XML, JSON, 텍스트 또는 기타 유형의 데이터를 사용할 수 있습니다.
Java RESTful 웹 서비스 API
RESTful 웹 서비스용 Java API(JAX-RS)는 REST 웹 서비스를 생성하기 위한 Java API입니다. JAX-RS는 주석을 사용하여 웹 서비스의 개발 및 배치를 단순화합니다. JAX-RS는 JDK의 일부이므로 주석을 사용하기 위해 아무것도 포함할 필요가 없습니다.
편안한 웹 서비스 주석
중요한 JAX-RS 주석 중 일부는 다음과 같습니다.
@Path
: 클래스 및 메소드의 상대 경로를 지정하는 데 사용됩니다. Path 주석 값을 스캔하여 웹 서비스의 URI를 얻을 수 있습니다.@GET
,@PUT
,@POST
,@DELETE
및@HEAD
: 메서드에 대한 HTTP 요청 유형을 지정하는 데 사용됩니다.@Produces
,@Consumes
: 요청 및 응답 유형을 지정하는 데 사용됩니다.@PathParam
: 메서드 매개변수를 구문 분석하여 경로 값에 바인딩하는 데 사용됩니다.
편안한 웹 서비스 및 SOAP
- SOAP는 프로토콜인 반면 REST는 아키텍처 스타일입니다.
- SOAP 서버와 클라이언트 애플리케이션은 긴밀하게 결합되어 WSDL 계약과 바인딩되지만 REST 웹 서비스와 클라이언트에는 계약이 없습니다.
- SOAP 웹 서비스와 비교할 때 REST는 학습 곡선이 쉽습니다.
- REST 웹 서비스 요청 및 응답 유형은 XML, JSON, 텍스트 등일 수 있지만 SOAP는 XML에서만 작동합니다.
- JAX-RS는 REST 웹 서비스용 Java API인 반면 JAX-WS는 SOAP 웹 서비스용 Java API입니다.
REST API 구현
JAX-RS API에는 두 가지 주요 구현이 있습니다.
- Jersey: Jersey는 Sun에서 제공하는 참조 구현입니다. Jersey를 JAX-RS 구현으로 사용하려면 web.xml에서 해당 서블릿을 구성하고 필요한 종속성을 추가하기만 하면 됩니다. JAX-RS API는 Jersey가 아닌 JDK의 일부이므로 애플리케이션에 종속성 jar를 추가해야 합니다.
- RESTEasy: RESTEasy는 JAX-RS 구현을 제공하는 JBoss 프로젝트입니다.
Java Restful 웹 서비스 자습서
Jersey와 RESTEasy를 사용하여 Restful 웹 서비스를 만드는 것이 얼마나 쉬운지 봅시다. HTTP를 통해 다음 메서드를 노출하고 Chrome Postman 확장 프로그램을 사용하여 이를 테스트합니다.
URI | HTTP Method | Description |
---|---|---|
/person/{id}/getDummy | GET | Returns a dummy person object |
/person/add | POST | Adds a person |
/person/{id}/delete | GET | Delete the person with ‘id’ in the URI |
/person/getAll | GET | Get all persons |
/person/{id}/get | GET | Get the person with ‘id’ in the URI |
Jersey Restful 웹 서비스
<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>JAXRS-Example</groupId>
<artifactId>JAXRS-Example</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-server</artifactId>
<version>1.19</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-servlet</artifactId>
<version>1.19</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.19</version>
</dependency>
</dependencies>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
<configuration>
<warSourceDirectory>WebContent</warSourceDirectory>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
Jersey 클라이언트 종속성을 추가할 필요는 없지만 Jersey를 사용하여 REST 웹 서비스를 호출하기 위해 Java 프로그램을 작성하는 경우 필요합니다. 이제 웹 응용 프로그램을 만들기 위해 Jersey를 구성하는 방법을 알아보기 위해 배포 설명자를 살펴보겠습니다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="https://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="https://xmlns.jcp.org/xml/ns/javaee https://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>JAXRS-Example</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>/*</url-pattern>
</servlet-mapping>
<!-- Jersey Servlet configurations -->
</web-app>
이것이 Jersey를 웹 애플리케이션에 플러그인하는 데 필요한 모든 것입니다. Java 코드에서 JAX-RS 주석을 사용할 것입니다. 웹 서비스 자원 및 메소드에 대해 스캔할 패키지를 제공하는 초기 매개변수 com.sun.jersey.config.property.packages
의 값을 확인하십시오.
REST 예제 모델 클래스
먼저 애플리케이션 데이터용 Person
과 클라이언트 시스템에 응답을 보내기 위한 Response
라는 두 가지 모델 빈을 생성합니다. XML 응답을 보낼 것이므로 빈은 @XmlRootElement
로 주석을 달아야 하므로 이 클래스가 있습니다.
package com.journaldev.jaxrs.model;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement (name="person")
public class Person {
private String name;
private int age;
private int id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString(){
return id+"::"+name+"::"+age;
}
}
package com.journaldev.jaxrs.model;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Response {
private boolean status;
private String message;
public boolean isStatus() {
return status;
}
public void setStatus(boolean status) {
this.status = status;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
REST 웹 서비스 자습서 서비스
우리의 URI 구조를 기반으로 아래는 서비스 인터페이스와 구현 코드입니다.
package com.journaldev.jaxrs.service;
import com.journaldev.jaxrs.model.Person;
import com.journaldev.jaxrs.model.Response;
public interface PersonService {
public Response addPerson(Person p);
public Response deletePerson(int id);
public Person getPerson(int id);
public Person[] getAllPersons();
}
package com.journaldev.jaxrs.service;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import com.journaldev.jaxrs.model.Person;
import com.journaldev.jaxrs.model.Response;
@Path("/person")
@Consumes(MediaType.APPLICATION_XML)
@Produces(MediaType.APPLICATION_XML)
public class PersonServiceImpl implements PersonService {
private static Map<Integer,Person> persons = new HashMap<Integer,Person>();
@Override
@POST
@Path("/add")
public Response addPerson(Person p) {
Response response = new Response();
if(persons.get(p.getId()) != null){
response.setStatus(false);
response.setMessage("Person Already Exists");
return response;
}
persons.put(p.getId(), p);
response.setStatus(true);
response.setMessage("Person created successfully");
return response;
}
@Override
@GET
@Path("/{id}/delete")
public Response deletePerson(@PathParam("id") int id) {
Response response = new Response();
if(persons.get(id) == null){
response.setStatus(false);
response.setMessage("Person Doesn't Exists");
return response;
}
persons.remove(id);
response.setStatus(true);
response.setMessage("Person deleted successfully");
return response;
}
@Override
@GET
@Path("/{id}/get")
public Person getPerson(@PathParam("id") int id) {
return persons.get(id);
}
@GET
@Path("/{id}/getDummy")
public Person getDummyPerson(@PathParam("id") int id) {
Person p = new Person();
p.setAge(99);
p.setName("Dummy");
p.setId(id);
return p;
}
@Override
@GET
@Path("/getAll")
public Person[] getAllPersons() {
Set<Integer> ids = persons.keySet();
Person[] p = new Person[ids.size()];
int i=0;
for(Integer id : ids){
p[i] = persons.get(id);
i++;
}
return p;
}
}
대부분의 코드는 자명합니다. JAX-RS 주석 @Path
, @PathParam
, @POST
, < 코드>@GET, @Consumes
및 @Produces
.
편안한 웹 서비스 테스트
이것이 Jersey JAX-RS 구현을 사용하여 웹 서비스를 만들기 위한 전부입니다. 보시다시피 대부분의 코드는 JAX-RS 주석을 사용하고 Jersey는 배포 설명자와 종속성을 통해 연결됩니다.
RESTEasy RESTful 웹 서비스 예제
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>3.0.13.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxb-provider</artifactId>
<version>3.0.13.Final</version>
</dependency>
아래는 Resteasy 서블릿을 구성하는 web.xml 파일입니다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="https://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="https://xmlns.jcp.org/xml/ns/javaee https://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>JAXRS-Example-RestEasy</display-name>
<listener>
<listener-class>
org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
</listener-class>
</listener>
<servlet>
<servlet-name>resteasy-servlet</servlet-name>
<servlet-class>
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.journaldev.jaxrs.resteasy.app.MyApp</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>resteasy-servlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
MyApp
클래스를 값으로 제공하는 init-param에 주목하십시오. 여기서는 아래와 같이 javax.ws.rs.core.Application
클래스를 확장합니다.
package com.journaldev.jaxrs.resteasy.app;
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.core.Application;
import com.journaldev.jaxrs.service.PersonServiceImpl;
public class MyApp extends Application {
private Set<Object> singletons = new HashSet<Object>();
public MyApp() {
singletons.add(new PersonServiceImpl());
}
@Override
public Set<Object> getSingletons() {
return singletons;
}
}
RESTEasy 웹 서비스 테스트
그게 다야. RESTEasy JAX-RS 구현으로 웹 서비스가 준비되었습니다. 다음은 Postman 크롬 확장 테스트의 일부 출력입니다.
이것이 Restful Web Services Tutorial의 전부입니다. JAX-RS 주석에 대해 배우고 코드를 재사용하고 Jersey에서 RESTEasy로 쉽게 이동하는 데 도움이 되는 표준 API의 이점을 이해하셨기를 바랍니다.