웹사이트 검색

스프링 레스트 컨트롤러


Spring RestController 주석은 @Controller 및 @ResponseBody로 주석이 추가된 편리한 주석입니다. 이 주석은 요청 핸들러로 표시하기 위해 클래스에 적용됩니다. Spring RestController 주석은 Spring MVC를 사용하여 RESTful 웹 서비스를 생성하는 데 사용됩니다. Spring RestController는 요청 데이터를 정의된 요청 처리기 메서드에 매핑합니다. 핸들러 메서드에서 응답 본문이 생성되면 이를 JSON 또는 XML 응답으로 변환합니다.

Spring RestController 예제

Spring RestController Maven 종속성

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>

REST 웹 서비스의 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>

가장 중요한 부분은 RequestMappingHandlerAdapter messageConverters 속성에서 정의되고 설정된 jsonMessageConverterxmlMessageConverter 빈입니다. 애플리케이션이 JSON과 XML을 모두 지원하기를 원한다는 것을 Spring에 알리는 데 필요한 전부이며 변환에 사용할 빈입니다.

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")
	//Returning is List is supported with JSON response only
	//If you want XML, then add a wrapper class as Root XML element, for example EmployeeList
	public List<Employee> 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은 가능하기 때문에 Spring은 JSON 응답만 지원합니다. 목록을 XML로 반환하도록 지원하려면 이 목록을 보관하고 반환할 래퍼 클래스를 만들어야 합니다. 우리는 일부 메소드의 요청으로 Employee 객체를 예상하고 있으며 Spring은 요청 본문을 구문 분석하고 이러한 메소드에 대한 Employee 객체로 변환합니다. 유사하게 우리는 Employee 객체를 Response Body로 반환하고 있으며 Spring은 이를 JSON/XML 응답으로 변환하는 작업을 다시 처리합니다.

Accept 및 Content-Type 요청 헤더

XML과 JSON 모두에서 작동하도록 REST 애플리케이션을 구성했습니다. 따라서 요청이 XML인지 JSON인지 어떻게 알 수 있습니까? 그리고 응답을 JSON 또는 XML 형식으로 보내야 하는지 여부. 여기에서 AcceptContent-Type 요청 헤더가 사용됩니다. Content-Type: 요청 본문의 콘텐츠 유형을 정의합니다. 값이 "application/xml\이면 Spring은 요청 본문을 XML 문서로 처리합니다. 값이 "application/json\이면 요청 본문은 다음과 같이 처리됩니다. JSON.JSON 수락: 클라이언트가 응답으로 기대하는 콘텐츠 유형을 정의합니다. 값이 \application/xml이면 XML 응답이 전송됩니다. 값이 \application/json이면 JSON 응답이 전송됩니다.

Spring RestController 테스트

애플리케이션을 테스트할 준비가 되었습니다. Tomcat-9에 배포하고 Postman으로 테스트했습니다. 아래는 설명과 함께 테스트 결과입니다.

Spring RestController GET JSON 응답

Spring RestController GET XML 응답

Spring RestController GET 목록

스프링 레스트 컨트롤러 POST

Spring RestController DELETE

요약

Spring RestController는 REST 웹 서비스 API를 생성하기 위한 모든 상용구를 처리하여 비즈니스 로직에 집중할 수 있도록 도와줍니다.

GitHub 리포지토리에서 전체 프로젝트를 다운로드할 수 있습니다.