1. 소개

이 기사에서는 Spring MVC의 핵심 개념 인 컨트롤러에 초점을 맞출 것입니다.

2. 개요

한 발 뒤로 물러나 일반적인 Spring Model View Controller 아키텍처 에서 Front Controller 의 개념을 살펴 보겠습니다 .

매우 높은 수준에서 우리가보고있는 주요 책임은 다음과 같습니다.

  • 들어오는 요청을 가로 챕니다.
  • 요청의 페이로드를 데이터의 내부 구조로 변환합니다.
  • 추가 처리를 위해 데이터를 모델보냅니다.
  • 모델 에서 처리 된 데이터를 가져와 렌더링을 위해 해당 데이터를 뷰로 이동 합니다.

다음은 Spring MVC 의 높은 수준의 흐름에 대한 빠른 다이어그램입니다 .

SpringMVC

보시다시피 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_nametest-mvc이므로이 예제에서 DispatcherServlettest-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 에 의해 TestControllergetTestData 메서드 로 라우팅됩니다 .

물론 우리는 좋은 측정을 위해 일부 모델 데이터와 함께 ModelAndView 객체를 반환합니다 .

보기 개체의 이름은 " welcome "으로 설정되어 있습니다. 위에서 설명한 것처럼 View ResolverWEB-INF 폴더에서 " welcome.jsp " 라는 페이지를 검색합니다 .

아래에서 GET 작업 예의 결과를 볼 수 있습니다 .

result_final

참고 그 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는 일반적으로 단순히 원시 데이터 클라이언트로 다시 돌아갑니다 XMLJSON의 일반적 표현을 - 그리고 그래서 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 응답의 본문에 직접 출력을 작성하도록 지시합니다 .

출력의 빠른 스냅 샷이 아래에 표시됩니다.

7 월 16 일

위의 출력은 학생 ID1 인 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에서 컨트롤러를 사용하는 기본 사항을 살펴 봅니다.

물론이 기사의 모든 코드는 GitHub에서 사용할 수 있습니다 .