Spring MVC


본 카테고리는 스프링 프레임워크를 다룬다.

좀 더 자세한 내용은 아래의 공식 사이트를 참고하자.

참고 스프링 프레임워크 공식 사이트


종류별로 다양한 세팅이 있는데, 이걸 다 인지하고 있어야 하는가?

스프링의 MVC 패턴

스프링에서 MVC를 실행하는 데 필요한 설정은 다음과 같다.

  • 스프링 MVC의 주요 설정
    • HandlerMapping
    • View Resolver
  • 스프링의 DispatcherServlet 설정

스프링의 MVC를 사용하려면 다양한 구성 요소를 설정해야 한다.

스프링 2.5나 3버전에서는 스프링 MVC를 사용하기 위해 상황에 맞는 설정을 일일이 구성해야 했다.

어떤 경우가 있었는지 사례가 듣고 싶다.

스프링 4부터는 @EnableWebMvc 어노테이션이 복잡한 설정을 대신 해주도록 개선되었다.

@EnableWebMvc 어노테이션을 사용하면 내부적으로 다양한 빈 설정을 추가해주는 가장 기본적인 MVC 설정을 해준다.

위의 설정을 적용한 코드는 아래와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
@EnableWebMvc // 스프링의 MVC 설정 활성화
public class MvcConfig implements WebMvcConfigurer {

// DispatcherServlet 매핑 경로를 위한 설정 추가
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}

// 컨트롤러의 실행결과를 보여주기 위한 설정 추가
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/view/", ".jsp");
}
}

@EnableWebMvc 어노테이션은 스프링의 MVC 설정을 활성화한다.

WebMvcConfigurer 인터페이스를 구현하면 스프링 MVC의 개별 설정을 조정할 때 사용한다.

configureDefaultServletHandling 메소드는 DispatcherServlet의 매핑 경로를 /로 주었을때 JSP, HTML, CSS 등을 올바르게 처리하기 위한 설정을 추가한다.

configureViewResolvers 메소드는 JSP를 이용해서 컨트롤러의 실행결과를 보여주기 위한 설정을 추가한다.

web.xml파일에 DispatcherServlet 설정

스프링 MVC가 웹 요청을 처리하려면 DispatcherServlet을 통해서 우베 요청을 받아야 한다.

이를 위해 web.xml파일에 DispatcherServlet을 등록해야 하며, 경로는 src/main/webapp/WEB-INF/web.xml 이다.

아래 예제를 확인하자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">

<servlet>
<servlet-name>dispatcher</servlet-name>
<!-- DispatcherServlet을 dispatcher라는 이름으로 등록 -->
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>

<!-- contextClass 초기화 파라미터 설정 -->
<!-- java 설정을 사용하는 경우 AnnotationConfigApplicationContext 사용 -->
<init-param>
<param-name>contextClass</param-name>
<param-value>
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
</param-value>
</init-param>

<!-- contextConfiguration 초기화 파라미터 설정 -->
<!-- 파라미터로 스프링 설정 클래스 목록을 지정한다 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
config.MvcConfig
config.ControllerConfig
</param-value>
</init-param>
<!-- 컨테이너가 웹 애플리케이션 초기화시 이 서블릿을 실행하도록 설정 -->
<load-on-startup>1</load-on-startup>
</servlet>

<!-- 모든 요청을 DispatcherServlet이 처리하도록 서블릿 매핑 설정 -->
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

<!-- HTTP 요청 파라미터의 인코딩 처리를 위한 필터 등록 -->
<!-- 스프링은 인코딩 처리를 위한 필터로 CharacterEncodingFilter를 제공한다 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

</web-app>

컨트롤러 구현

컨트롤러는 아래와 같이 구현한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

// @Controller 어노테이션을 적용한 클래스는 스프링 MVC에서 컨트롤러로 사용된다.
@Controller
public class HelloController {

// @GetMapping 어노테이션은 메소드가 처리할 HTTP 요청의 경로를 지정한다
@GetMapping("/hello")
public String hello(
// Model 파라미터는 컨트롤러의 처리 결과를 뷰에 전달할 때 사용된다.
Model model,
// @RequestParam 어노테이션은 HTTP요청 파라미터의 값을 메소드의 파라미터로 전달한다.
@RequestParam(value = "name", required = false) String name) {

// greeting 속성에 값을 설정한다.
model.addAttribute("greeting", "안녕하세요, " + name);

// 컨트롤러의 처리 결과를 보여줄 뷰의 이름으로 hello를 사용한다.
return "hello";
}
}

위의 코드에 대한 설명을 주석을 참고하면 된다.

@GetMapping 어노테이션을 보면 유추할 수 있듯 GET 방식의 요청을 처리하는 메소드임을 알 수 있는데, POST 방식을 처리하려면 @PostMapping 어노테이션을 쓰는 방식으로 처리할 수 있다.

컨트롤러 등록

컨트롤러를 구현했따면 해당 컨트롤러를 스프링의 빈으로 등록해야한다.

아래와 같은 코드로 등록할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import chap09.HelloController;

@Configuration
public class ControllerConfig {

@Bean
public HelloController helloController() {
return new HelloController();
}
}

스프링 MVC의 확장

상술한 포스팅에서 다룬 것은 아래와 같다.

  • 스프링 MVC 설정
  • 웹 브라우저의 요청을 처리할 컨트롤러 구현

스프링의 MVC는 위에서 크게 벗어나진 않지만 아래와 같은 확장이 가능하다.

  • 컨트롤러의 처리 결과를 보여줄 뷰 코드 구현
  • 컨트롤러에서 요청 파라미터의 값을 하나의 객체로 받고 값 검증
  • 스프링이 제공하는 JSP 커스텀 태그를 이용한 폼 처리
  • 컨트롤러에서 세션 혹은 쿠키 사용
  • 인터셉터로 컨트롤러에 대한 접근 처리
  • JSON 응답 처리