1. 소개
이 기사에서는 Spring MVC의 핵심 개념 인 컨트롤러에 초점을 맞출 것입니다.
2. 개요
한 발 뒤로 물러나 일반적인 Spring Model View Controller 아키텍처 에서 Front Controller 의 개념을 살펴 보겠습니다 .
매우 높은 수준에서 우리가보고있는 주요 책임은 다음과 같습니다.
- 들어오는 요청을 가로 챕니다.
- 요청의 페이로드를 데이터의 내부 구조로 변환합니다.
- 추가 처리를 위해 데이터를 모델 로 보냅니다.
- 모델 에서 처리 된 데이터를 가져와 렌더링을 위해 해당 데이터를 뷰로 이동 합니다.
다음은 Spring MVC 의 높은 수준의 흐름에 대한 빠른 다이어그램입니다 .
보시다시피 DispatcherServlet 은 아키텍처에서 Front Controller 의 역할을합니다 .
다이어그램은 일반적인 MVC 컨트롤러와 RESTful 컨트롤러 모두에 적용 할 수 있으며 약간의 차이가 있습니다 (아래 설명 참조).
전통적인 접근 방식에서 MVC 애플리케이션은 서비스 지향적이지 않으므로 컨트롤러 에서 수신 한 데이터를 기반으로 최종 뷰를 렌더링 하는 V iew Resolver 가 있습니다 .
RESTful 애플리케이션은 서비스 지향적이며 원시 데이터 (일반적으로 JSON / XML)를 반환하도록 설계되었습니다. 이러한 응용 프로그램은 뷰 렌더링을 수행하지 않기 때문에 뷰 리졸버 가 없습니다 . 컨트롤러 는 일반적으로 HTTP 응답을 통해 직접 데이터를 전송해야합니다.
MVC0 스타일 컨트롤러부터 시작하겠습니다.
3. Maven 의존성
Spring MVC 로 작업 할 수 있도록 먼저 Maven 의존성을 처리해 보겠습니다.
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.6.RELEASE</version>
<dependency>
최신 버전의 라이브러리를 얻으려면 Maven Central 에서 spring-webmvc를 살펴보십시오 .
4. 프로젝트 웹 구성
이제 컨트롤러 자체를 살펴보기 전에 먼저 간단한 웹 프로젝트를 설정하고 빠른 Servlet 구성을 수행해야 합니다.
먼저 web.xml 을 사용하지 않고 대신 이니셜 라이저를 사용 하여 DispatcherServlet 을 설정 하는 방법을 살펴 보겠습니다 .
public class StudentControllerConfig implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext sc) throws ServletException {
AnnotationConfigWebApplicationContext root =
new AnnotationConfigWebApplicationContext();
root.register(WebConfig.class);
root.refresh();
root.setServletContext(sc);
sc.addListener(new ContextLoaderListener(root));
DispatcherServlet dv =
new DispatcherServlet(new GenericWebApplicationContext());
ServletRegistration.Dynamic appServlet = sc.addServlet("test-mvc", dv);
appServlet.setLoadOnStartup(1);
appServlet.addMapping("/test/*");
}
}
XML없이 설정하려면 클래스 경로에 servlet-api 3.1.0 이 있어야 합니다.
여기에 방법 의 web.xml은 같을 것이다 :
<servlet>
<servlet-name>test-mvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/test-mvc.xml</param-value>
</init-param>
</servlet>
여기서 contextConfigLocation 속성을 설정하고 있습니다 -Spring 컨텍스트를로드하는 데 사용되는 XML 파일을 가리 킵니다 . 속성이 없으면 Spring은 {servlet_name} -servlet.xml 이라는 파일을 검색합니다 .
우리의 경우 servlet_name 은 test-mvc이므로이 예제에서 DispatcherServlet 은 test-mvc-servlet.xml 이라는 파일을 검색합니다 .
마지막으로 DispatcherServlet 을 설정하고 특정 URL에 매핑하여 여기에서 Front Controller 기반 시스템 을 완성 합니다.
<servlet-mapping>
<servlet-name>test-mvc</servlet-name>
<url-pattern>/test/*</url-pattern>
</servlet-mapping>
따라서이 경우 DispatcherServlet 은 패턴 / test / * 내의 모든 요청을 가로 챌 것 입니다.
5. Spring MVC 웹 구성
이제 Spring Config를 사용하여 Dispatcher Servlet 을 설정 하는 방법을 살펴 보겠습니다 .
@Configuration
@EnableWebMvc
@ComponentScan(basePackages= {
"com.baeldung.controller.controller",
"com.baeldung.controller.config" })
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureDefaultServletHandling(
DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver bean =
new InternalResourceViewResolver();
bean.setPrefix("/WEB-INF/");
bean.setSuffix(".jsp");
return bean;
}
}
이제 XML을 사용하여 Dispatcher Servlet 을 설정하는 방법을 살펴 보겠습니다 . DispatcherServlet XML 파일 의 스냅 샷 – DispatcherServlet이 사용자 정의 컨트롤러 및 기타 Spring 엔티티 를로드하는 데 사용 하는 XML 파일 은 다음과 같습니다.
<context:component-scan base-package="com.baledung.controller" />
<mvc:annotation-driven />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>/WEB-INF/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
이 간단한 구성을 기반으로 프레임 워크는 물론 클래스 경로에서 찾을 컨트롤러 빈을 초기화합니다.
또한 뷰 렌더링을 담당하는 View Resolver를 정의하고 있음을 주목 하십시오. 여기서 Spring의 InternalResourceViewResolver를 사용할 것입니다. 이는 뷰 의 이름이 확인 될 것으로 예상합니다. 즉, 접두사와 접미사 (모두 XML 구성에 정의 됨)를 사용하여 해당 페이지를 찾는 것을 의미 합니다.
그래서 예를 들어, 경우 컨트롤러 반환 보기 "라는 환영" , 뷰 리졸버 라는 페이지를 해결하기 위해 노력할 것 "위해 welcome.jsp" 에 WEB-INF의 폴더에 저장합니다.
6. MVC 컨트롤러
이제 마지막으로 MVC 스타일 컨트롤러를 구현해 보겠습니다.
모델 맵 과 뷰 객체 를 포함하는 ModelAndView 객체를 어떻게 반환하는지 주목하십시오 . 둘 다 데이터 렌더링을 위해 V iew Resolver 에서 사용됩니다 .
@Controller
@RequestMapping(value = "/test")
public class TestController {
@GetMapping
public ModelAndView getTestData() {
ModelAndView mv = new ModelAndView();
mv.setViewName("welcome");
mv.getModel().put("data", "Welcome home man");
return mv;
}
}
그래서 우리가 여기서 정확히 무엇을 설정했는지.
먼저 TestController 라는 컨트롤러 를 만들고 "/ test" 경로에 매핑했습니다 . 클래스에서 ModelAndView 객체 를 반환하고 GET 요청에 매핑 되는 메서드를 만들었습니다. 따라서 " test "로 끝나는 모든 URL 호출 은 DispatcherServlet 에 의해 TestController 의 getTestData 메서드 로 라우팅됩니다 .
물론 우리는 좋은 측정을 위해 일부 모델 데이터와 함께 ModelAndView 객체를 반환합니다 .
보기 개체의 이름은 " welcome "으로 설정되어 있습니다. 위에서 설명한 것처럼 View Resolver 는 WEB-INF 폴더에서 " welcome.jsp " 라는 페이지를 검색합니다 .
아래에서 GET 작업 예의 결과를 볼 수 있습니다 .
참고 그 URL이 와 끝 "테스트" . URL 의 패턴 은 "/ test / test "입니다.
첫 번째 "/ test" 는 Servlet에서 가져오고 두 번째 "/ test" 는 컨트롤러 매핑에서 가져옵니다.
7. REST에 대한 더 많은 스프링 의존성
이제 RESTful 컨트롤러를 살펴 보겠습니다. 물론 시작하기에 좋은 곳은 우리가 필요로하는 추가적인 Maven 의존성입니다.
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.0.6.RELEASE</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.5</version>
</dependency>
</dependencies>
을 참조하시기 바랍니다 잭슨 코어 , Spring-webmvc 와 스프링 웹 그 종속의 최신 버전에 대한 링크를 제공합니다.
물론 여기에서 Jackson 은 필수는 아니지만 JSON 지원을 활성화하는 좋은 방법입니다. 해당 지원에 대해 자세히 알아 보려면 여기 에서 메시지 변환기 문서를 참조하세요 .
8. REST 컨트롤러
Spring RESTful 애플리케이션 의 설정 은 MVC 애플리케이션의 설정과 동일하지만 V iew Resolvers 와 모델 맵 이 없다는 점만 다릅니다 .
- API는 일반적으로 단순히 원시 데이터 클라이언트로 다시 돌아갑니다 XML 및 JSON의 일반적 표현을 - 그리고 그래서 DispatcherServlet이이 우회 뷰 리졸버 및 반환 HTTP Response body에 데이터를 오른쪽으로 .
간단한 RESTful 컨트롤러 구현을 살펴 보겠습니다.
@Controller
public class RestController {
@GetMapping(value = "/student/{studentId}")
public @ResponseBody Student getTestData(@PathVariable Integer studentId) {
Student student = new Student();
student.setName("Peter");
student.setId(studentId);
return student;
}
}
메서드에 대한 @ResponseBody 어노테이션에 주목하세요. 이것은 Spring이 뷰 리졸버 를 우회 하고 본질적으로 HTTP 응답의 본문에 직접 출력을 작성하도록 지시합니다 .
출력의 빠른 스냅 샷이 아래에 표시됩니다.
위의 출력은 학생 ID 가 1 인 API에 GET 요청을 보낸 결과입니다 .
여기서 한 가지 빠른 메모 는 @RequestMapping 어노테이션은 잠재력을 최대한 활용하기 위해 실제로 탐색해야하는 핵심 어노테이션 중 하나입니다.
9. 스프링 부트와 @RestController 어노테이션
Spring Boot 의 @RestController 어노테이션은 기본적으로 @ResponseBody 를 항상 정의 할 필요가 없도록 하는 빠른 바로 가기입니다 .
다음은이 새 어노테이션을 사용하는 이전 예제 컨트롤러입니다.
@RestController
public class RestAnnotatedController {
@GetMapping(value = "/annotated/student/{studentId}")
public Student getData(@PathVariable Integer studentId) {
Student student = new Student();
student.setName("Peter");
student.setId(studentId);
return student;
}
}
10. 결론
이 사용방법(예제)에서는 일반적인 MVC 애플리케이션과 RESTful API의 관점에서 Spring에서 컨트롤러를 사용하는 기본 사항을 살펴 봅니다.
- https://docs.spring.io/spring-framework/docs/current/reference/html
- https://www.baeldung.com/spring-controllers
'Java' 카테고리의 다른 글
Spring을 사용한 JPA 사용방법(예제) (0) | 2021.04.13 |
---|---|
Java Weekly, 365 호 (0) | 2021.04.13 |
Spring MVC의 Model, ModelMap 및 ModelAndView (0) | 2021.04.13 |
Spring 웹 컨텍스트 (0) | 2021.04.12 |
Spring 선택적 경로 변수 (0) | 2021.04.12 |