Spring RestTemplate은 RESTful 웹 서비스를 테스트하기 위한 편리한 방법을 제공합니다.
Spring RestTemplate
- Spring RestTemplate 클래스는 Spring 3에서 소개된
spring-web
의 일부입니다. - RestTemplate은 HTTP 기반 RESTful 웹 서비스를 테스트하는 데 사용할 수 있으며, HTTPS 프로토콜은 지원하지 않습니다.
- RestTemplate 클래스는 GET, POST, PUT, DELETE 등과 같은 다양한 HTTP 메서드에 대한 오버로딩된 메서드를 제공합니다.
Spring RestTemplate 예제
Spring Data JPA 기사에서 생성된 REST 웹 서비스를 테스트하는 Spring RestTemplate 예제를 살펴봅시다. 아래 표는 이 REST 웹 서비스에서 지원하는 URI를 보여줍니다. .tg {border-collapse:collapse;border-spacing:0;border-color:#999;} .tg td{font-family:Arial, sans-serif;font-size:14px;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:#999;color:#444;background-color:#F7FDFA;} .tg th{font-family:Arial, sans-serif;font-size:14px;font-weight:normal;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:#999;color:#fff;background-color:#26ADE4;} .tg .tg-baqh{text-align:center;vertical-align:top} .tg .tg-yw4l{vertical-align:top}
URI | HTTP Method | Description |
---|---|---|
/springData/person | GET | Get all persons from database |
/springData/person/{id} | GET | Get person by id |
/springData/person | POST | Add person to database |
/springData/person | PUT | Update person |
/springData/person/{id} | DELETE | Delete person by id |
이제 웹 서비스를 테스트하기 위해 Rest 클라이언트 프로젝트를 생성해 봅시다. 아래 이미지는 최종적인 Spring RestTemplate 예제 프로젝트를 보여줍니다.
Spring RestTemplate Maven Dependencies
우리는 spring-core
, spring-context
종속성이 필요합니다. 스프링 프레임워크를 위해. 그런 다음 RestTemplate
클래스를 포함하는 spring-web
아티팩트가 필요합니다. 또한 Spring JSON을 지원하기 위해 Jackson API를 위해 jackson-mapper-asl
가 필요합니다.
<?xml version="1.0" encoding="UTF-8"?>
<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.spring</groupId>
<artifactId>SpringRestTemplate</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<spring.framework>4.3.0.RELEASE</spring.framework>
<spring.web>3.0.2.RELEASE</spring.web>
<serializer.version>2.8.1</serializer.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.framework}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.framework}</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.4</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.web}</version>
</dependency>
</dependencies>
</project>
스프링 구성 클래스
RestTemplate 클래스를 위한 스프링 빈을 정의해야 합니다. 이것은 AppConfig
클래스에서 완료됩니다.
package com.journaldev.spring.config;
import org.codehaus.jackson.map.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.MappingJacksonHttpMessageConverter;
import org.springframework.web.client.RestTemplate;
@Configuration
@ComponentScan("com.journaldev.spring")
public class AppConfig {
@Bean
RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
MappingJacksonHttpMessageConverter converter = new MappingJacksonHttpMessageConverter();
converter.setObjectMapper(new ObjectMapper());
restTemplate.getMessageConverters().add(converter);
return restTemplate;
}
}
RestTamplate은 MessageConverter를 사용하며, 이 속성을 RestTemplate 빈에 설정해야 합니다. 우리의 예제에서는 JSON 형식에서 데이터를 가져오기 위해 MappingJacksonHttpMessageConverter
를 사용합니다.
모델 클래스
우리는 웹 서비스에서 반환된 JSON을 jackson mapper를 사용하여 자바 객체로 변환하려고 하기 때문에 이를 위한 모델 클래스를 생성해야 합니다. 이 모델 클래스는 웹 서비스에서 사용된 모델 클래스와 매우 유사할 것입니다. 다만 여기서는 JPA 주석이 필요하지 않습니다.
package com.journaldev.spring.model;
public class Person {
private Long id;
private Integer age;
private String firstName;
private String lastName;
public Person() {
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
@Override
public String toString() {
return "Person{" + "id=" + id + ", age=" + age + ", firstName='" + firstName + '\'' + ", lastName='" + lastName
+ '\'' + '}';
}
}
스프링 RestTemplate 클라이언트 클래스
마지막 단계는 위에서 정의한 RestTemplate 빈을 사용할 클라이언트 클래스를 생성하는 것입니다.
package com.journaldev.spring.config;
import java.util.List;
import org.springframework.http.HttpStatus;
import com.journaldev.spring.model.Person;
public interface PersonClient {
List<Person> getAllPerson();
Person getById(Long id);
HttpStatus addPerson(Person person);
void updatePerson(Person person);
void deletePerson(Long id);
}
package com.journaldev.spring.config;
import java.util.Arrays;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import com.journaldev.spring.model.Person;
@Service
public class PersonClientImpl implements PersonClient {
@Autowired
RestTemplate restTemplate;
final String ROOT_URI = "https://localhost:8080/springData/person";
public List<Person> getAllPerson() {
ResponseEntity<Person[]> response = restTemplate.getForEntity(ROOT_URI, Person[].class);
return Arrays.asList(response.getBody());
}
public Person getById(Long id) {
ResponseEntity<Person> response = restTemplate.getForEntity(ROOT_URI + "/"+id, Person.class);
return response.getBody();
}
public HttpStatus addPerson(Person person) {
ResponseEntity<HttpStatus> response = restTemplate.postForEntity(ROOT_URI, person, HttpStatus.class);
return response.getBody();
}
public void updatePerson(Person person) {
restTemplate.put(ROOT_URI, person);
}
public void deletePerson(Long id) {
restTemplate.delete(ROOT_URI + id);
}
}
코드는 자명합니다. 우리는 URI 및 HTTP 메소드를 기반으로 RestTemplate 메소드를 호출하고 필요한 경우 적절한 요청 객체를 전달합니다.
스프링 RestTemplate 테스트 클래스
이제 우리의 스프링 RestTemplate 예제 프로젝트를 테스트할 시간입니다. 아래 클래스는 스프링 방식으로 RestTemplate 메소드를 사용하는 방법을 보여줍니다.
package com.journaldev.spring;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.http.HttpStatus;
import com.journaldev.spring.config.AppConfig;
import com.journaldev.spring.config.PersonClient;
import com.journaldev.spring.model.Person;
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
PersonClient client = applicationContext.getBean(PersonClient.class);
System.out.println("Getting list of all people:");
for (Person p : client.getAllPerson()) {
System.out.println(p);
}
System.out.println("\nGetting person with ID 2");
Person personById = client.getById(2L);
System.out.println(personById);
System.out.println("Adding a Person");
Person p = new Person();
p.setAge(50);
p.setFirstName("David");
p.setLastName("Blain");
HttpStatus status = client.addPerson(p);
System.out.println("Add Person Response = " + status);
applicationContext.close();
}
}
위 프로그램을 내 로컬 설정에 대해 실행하면 다음과 같은 출력이 나옵니다.
Getting list of all people:
Person{id=2, age=30, firstName='Oksi', lastName=' Bahatskaya'}
Person{id=1, age=30, firstName='Vlad', lastName='Mateo'}
Getting person with ID 2
Person{id=2, age=30, firstName='Oksi', lastName=' Bahatskaya'}
Adding a Person
Add Person Response = 201
아래 이미지는 위 프로그램을 실행하기 전후의 웹 서비스 데이터베이스 테이블 데이터를 보여줍니다. 프로그램 출력이 샘플 테이블 데이터와 일치함을 확인할 수 있습니다. 이것으로 스프링 RestTemplate 예제에 대한 설명을 마칩니다. 프로젝트는 아래 링크에서 다운로드할 수 있습니다.
Spring RestTemplate 예제 프로젝트 다운로드
참고: API 문서
Source:
https://www.digitalocean.com/community/tutorials/spring-resttemplate-example