Spring RestController 어노테이션은 편의 어노테이션으로, @Controller와 @ResponseBody
로 자체적으로 어노테이션이 달려 있습니다. 이 어노테이션은 클래스에 적용되어 해당 클래스를 요청 처리기로 표시합니다. Spring RestController 어노테이션은 Spring MVC를 사용하여 RESTful 웹 서비스를 생성하는 데 사용됩니다. Spring RestController는 요청 데이터를 정의된 요청 처리기 메소드로 매핑하는 작업을 처리합니다. 요청 처리기 메소드에서 응답 본문이 생성되면 해당 본문을 JSON 또는 XML 응답으로 변환합니다.
Spring RestController 예제
Spring에서 REST 웹 서비스를 생성하는 방법을 살펴보겠습니다. Spring Repository 구현을 재사용하고 RESTful 웹 서비스를 생성할 것입니다. 여기서는 독립형 웹 애플리케이션을 생성하고 Spring Boot를 사용하지 않을 것입니다. 또한 요청과 응답에서 JSON 및 XML을 모두 지원하도록 API를 노출시킬 것입니다. 아래 이미지는 최종 프로젝트 구조를 보여줍니다. 모델 및 Repository 클래스는 이미 Spring Repository 튜토리얼에서 제공되었습니다. 여기서는 RestController 구현에 더 중점을 둘 것입니다.
Spring RestController Maven Dependencies
우리의 Spring RestController 예제 프로젝트를 만들기 위해 필요한 종속성을 살펴보겠습니다.
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.0.7.RELEASE</version>
</dependency>
<!-- Jackson for REST JSON Support -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.6</version>
</dependency>
<!-- JAXB for XML Response, needed to explicitly define from Java 9 onwards -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.0</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>javax.activation-api</artifactId>
<version>1.2.0</version>
</dependency>
우리는 XML과 JSON 요청 및 응답을 지원하기 위해 Spring MVC, Jackson 및 JAXB 라이브러리가 필요합니다. 우리의 web.xml 파일은 Spring MVC DispatcherServlet을 프론트 컨트롤러로 구성하는 데 사용됩니다. 이제 Spring Context 파일을 살펴보겠습니다.
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans
xmlns="https://www.springframework.org/schema/mvc"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="https://www.springframework.org/schema/beans"
xmlns:context="https://www.springframework.org/schema/context"
xsi:schemaLocation="https://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
https://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
https://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />
<context:component-scan
base-package="com.journaldev.spring" />
<beans:bean id="jsonMessageConverter"
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
<beans:bean id="xmlMessageConverter"
class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter" />
<beans:bean
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<beans:property name="messageConverters">
<beans:list>
<beans:ref bean="jsonMessageConverter" />
<beans:ref bean="xmlMessageConverter" />
</beans:list>
</beans:property>
</beans:bean>
</beans:beans>
가장 중요한 부분은 jsonMessageConverter
와 xmlMessageConverter
빈이 RequestMappingHandlerAdapter
의 messageConverters
속성에 정의되고 설정된 것입니다. 이것만으로도 spring에게 우리의 애플리케이션이 JSON과 XML을 모두 지원하도록 하려면 이러한 빈을 사용하도록 지정하는 것이 필요합니다.
Spring RestController 클래스
여기 우리의 Spring RestController 클래스 구현입니다.
package com.journaldev.spring.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import com.journaldev.spring.model.Employee;
import com.journaldev.spring.repository.EmployeeRepository;
@RestController
public class EmployeeRestController {
@Autowired
private EmployeeRepository repository;
@GetMapping("/rest/employee/get/{id}")
public Employee getEmployeeByID(@PathVariable("id") int id) {
return repository.retrieve(id);
}
@GetMapping("/rest/employee/getAll")
//리스트 반환은 JSON 응답만 지원됩니다
//XML을 원하는 경우, 예를 들어 EmployeeList와 같은 래퍼 클래스를 추가하십시오.
public List getAllEmployees() {
return repository.getAll();
}
@PostMapping("/rest/employee/create")
public Employee createEmployee(@RequestBody Employee emp) {
repository.store(emp);
return emp;
}
@GetMapping("/rest/employee/search/{name}")
public Employee getEmployeeByName(@PathVariable("name") String name) {
return repository.search(name);
}
@DeleteMapping("/rest/employee/delete/{id}")
public Employee deleteEmployeeByID(@PathVariable("id") int id) {
return repository.delete(id);
}
}
알림: 여기서는 REST API만 정의했습니다. 모든 비즈니스 로직은 Repository 클래스의 일부입니다. 우리의 메소드가 목록이나 배열을 반환하는 경우에는 스프링이 XML 루트 요소를 익명으로 만들 수 없지만 JSON은 할 수 있기 때문에 스프링은 JSON 응답만 지원합니다. 목록을 XML로 반환하려면이 목록을 보유하고 반환하는 래퍼 클래스를 만들어야합니다. 일부 메소드에서 요청으로 직원 객체를 기대하고 있으므로 Spring은 요청 본문을 구문 분석하고이 메소드에 대해 직원 객체로 변환합니다. 마찬가지로 응답 본문으로 직원 객체를 반환하고 있으며 Spring은이를 JSON/XML 응답으로 변환하는 것을 처리합니다.
수락 및 콘텐츠 유형 요청 헤더
우리는 REST 응용 프로그램을 XML과 JSON 모두와 함께 작동하도록 구성했습니다. 그래서 요청이 XML 인지 JSON 인지 어떻게 알 수 있을까요? 그리고 응답이 JSON 또는 XML 형식으로 보내져야하는 경우는 어떨까요? 여기서 Accept
및 Content-Type
요청 헤더가 사용됩니다. Content-Type: 요청 본문의 콘텐츠 유형을 정의합니다. 값이 “application/xml”이면 Spring은 요청 본문을 XML 문서로 처리합니다. 값이 “application/json”이면 요청 본문은 JSON으로 처리됩니다. 수락: 클라이언트가 응답으로 기대하는 콘텐츠 유형을 정의합니다. 값이 “application/xml”이면 XML 응답이 전송됩니다. 값이 “application/json”이면 JSON 응답이 전송됩니다.
Spring RestController 테스트
우리의 어플리케이션이 테스트할 준비가 되었습니다. 저는 이를 Tomcat-9에 배포하고 Postman으로 테스트하고 있습니다. 아래는 설명과 함께 테스트 결과입니다.
Spring RestController GET JSON 응답
이것은 간단한 GET 요청입니다. 중요한 점은 “Accept” 헤더의 값입니다.
Spring RestController GET XML 응답
“Accept” 헤더 값을 “application/xml”로 변경하면 XML 응답을 받게 됩니다.
Spring RestController GET 목록
API를 호출하여 직원 목록을 가져오려고 시도해 봅시다. 익명의 루트 요소가 포함된 JSON 요소 목록을 가져오고 있습니다.
XML은 익명의 루트 요소를 지원하지 않으므로 예외 메시지가 발생합니다.
Spring RestController POST
JSON 요청 및 응답으로 Spring RestController POST JSON 요청 본문으로 Spring RestController POST
JSON 요청 및 XML 응답으로 Spring RestController POST
Spring RestController DELETE
요약
Spring RestController는 REST 웹 서비스 API를 만드는 데 필요한 모든 보일러 플레이트 작업을 처리하여 비즈니스 로직에 집중할 수 있도록 도와줍니다.
전체 프로젝트를 GitHub 저장소에서 다운로드할 수 있습니다.
Source:
https://www.digitalocean.com/community/tutorials/spring-restcontroller