
스프링을 사용하는 이유
스프링이 지원하는 웹 MVC 프레임워크 때문이다.
스프링 MVC의 설정 방법만 익혀두면 웹 개발에 필요한 다양한 기능을 구현할 수 있게 된다.
프로젝트 생성
웹 어플리케이션을 개발을 위한 메이븐/그레이들 프로젝트는 웹을 위한 디렉토리 구조가 추가된다.
- src/main/java
- src/main/webapp
- src/main/webapp/WEB-INF
- src/main/webapp/WEB-INF/view
webapp은 HTML, CSS, JS, JSP 등 웹 어플리케이션을 구현하는데 필요한 코드가 위치한다.
WEB-INF에는 web.xml 파일이 위치한다.
스프링 MVC 설정
스프링 MVC를 실행하는데 필요한 최소 설정은 다음과 같다.
- 스프링 MVC의 주요 설정(HandlerMapping, ViewResolver 등)
- 스프링의 DispatcherServlet 설정
package config;
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
public class MvcConfig implements WebMvcConfigurer {
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/view/", ".jsp");
}
}
- 10행: @EnableWebMvc 애노테이션은 스프링 MVC를 활성화한다. 스프링 MVC를 사용하는데 필요한 다양한 설정을 생성한다. (내부적으로 다양한 빈 설정 추가)
- 11행: WebMvcConfigurer 인터페이스는 스프링 MVC의 개별 설정을 조정할 때 사용한다. 아래의 configureDefaultServletHandling() 메서드와 configureViewResolvers() 메서드는 WebMvcConfigurer의 인터페이스에 정의된 메서드로 각각 디폴트 서블릿과 ViewResolver와 관련된 설정을 조정한다.
- 13~17행: DispatcherServlet의 매핑 경로를 '/'로 주었을 때, JSP/HTML/CSS 등을 올바르게 처리하기 위한 설정을 추가한다.
- 19~22행: JSP를 이용해서 컨트롤러의 실행 결과를 보여주기 위한 설정을 추가한다.
DispatcherServlet 설정
스프링 MVC가 웹 요청을 처리하려면 DispatcherServlet을 통해서 웹 요청을 받아야 한다. 이를 위해 web.xml 파일에 DispatcherServlet을 등록한다.
<!-- web.xml -->
<?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>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextClass</param-name>
<param-value>
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
</param-value>
</init-param>
<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>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<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>
- 10~13행: DispatcherServlet을 dispatcher라는 이름으로 등록한다.
- 14~19행: contextClass 초기화 파라미터를 설정한다. 자바 설정을 사용하는 경우 AnnotationConfigWebApplicationContext 클래스를 사용한다. 이 클래스는 자바 설정을 이용하는 웹 어플리케이션 용 스프링 컨테이너 클래스이다.
- 20~26행: contextConfiguration 초기화 파라미터를 설정한다. 이 파라미터에는 스프링 설정 클래스 목록을 지정한다. 각 설정 파일의 경로는 줄바꿈이나 콤마로 구분한다.
- 27행: 톰캣과 같은 컨테이너가 웹 어플리케이션을 구동할 때 이 서블릿을 함께 실행하도록 설정한다.
- 30~33행: 모든 요청을 DispatcherServlet이 처리하도록 서블릿 매핑을 설정했다.
DispatcherServlet은 초기화 과정에서 contextConfiguration 초기화 파라미터에 지정한 설정 파일을 이용해서 스프링 컨테이너를 포기화한다. 즉 이 설정은 MvcConfig 클래스와 ControllerConfig 클래스를 이용해서 스프링 컨테이너를 생성한다.
컨트롤러 구현
package chap09;
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
public class HelloController {
@GetMapping("/hello")
public String hello(Model model,
@RequestParam(value = "name", required = false) String name) {
model.addAttribute("greeting", "안녕하세요, " + name);
return "hello";
}
}
- 8행: @Controller 애노테이션을 적용한 클래스는 스프링 MVC에서 컨트롤러로 사용한다.
- 11행: @GetMapping 애노테이션은 메서드가 처리할 요청 경로를 지정한다. 위 코드의 경우 "/hello" 경로로 들어온 요청을 hello() 메서드를 이용해서 처리한다고 설정했다. HTTP 요청 메서드 중 GET 메서드에 대한 매핑을 설정한다.
- 12행: Model 파라미터는 컨트롤러의 처리 결과를 뷰에 전달할 때 사용한다.
- 13행: @RequestParam 애노테이션은 HTTP 요청 파라미터의 값을 메서드의 파라미터로 전달할 때 사용된다. 위 코드의 경우 name 요청 파라미터의 값을 name 파라미터에 전달한다. value 속성은 HTTP 요청 파라미터의 이름을 지정하고 required 속성은 필수 여부를 지정한다.
- 14행: "greeting"이라는 모델 속성에 값을 설정한다. 값으로는 "안녕하세요"와 name 파라미터의 값을 연결한 문자열을 사용한다. 뒤에서 작성할 JSP 코드는 이 속성을 이용해서 값을 출력한다. Model 객체의 addAttribute() 메서드는 뷰에 전달할 데이터를 지정하기 위해 사용된다. 뷰 코드는 이 속성을 사용해서 컨트롤러가 전달한 데이터가 접근하게 된다.
- 15행: 컨트롤러의 처리 결과를 보여줄 뷰 이름으로 "hello"를 사용한다. 이 뷰 이름은 논리적인 이름이며 실제로 뷰 이름에 해당하는 뷰 구현을 찾아주는 것은 ViewResolver가 처리한다.
스프링 MVC 프레임워크에서 컨트롤러란 간단히 설명하면 웹 요청을 처리하고 그 결과를 뷰에 전달하는 스프링 빈 객체이다. 컨트롤러를 구현했다면 컨트롤러를 스프링 빈으로 등록한다.
package config;
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();
}
}
JSP 구현
컨트롤러가 생성한 결과를 보여줄 뷰 코드를 만든다. 뷰 코드는 JSP를 이용해서 구현한다.
<!-- hello.jsp -->
<%@ page contentType="text/html; charset=utf-8" %>
<!DOCTYPE html>
<html>
<head>
<title>Hello</title>
</head>
<body>
인사말: ${greeting}
</body>
</html>
HelloContorller의 hello() 메서드가 리턴한 뷰 이름은 "hello"였는데 JSP파일 이름을 보면 "hello.jsp"이다. 뷰 이름과 JSP 파일과의 연결은 MvcConfig 클래스의 다음 설정을 통해서 이루어진다.
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/view/", ".jsp");
}
registry.jsp() 코드는 JSP를 뷰 구현으로 사용할 수 있도록 해주는 설정이다. jsp() 메서드의 첫 번째 인자는 JSP 파일 경로를 찾을 때 사용할 접두어이고, 두 번째 인자는 접미사이다. 뷰 이름의 앞과 뒤에 접두어와 접미사를 붙여서 최종적으로 사용할 JSP 파일의 경로를 결정한다.
hello.jsp의 8행 greeting과 같이 컨트롤러에서 설정한 속성을 뷰 JSP 코드에서 접근할 수 있는 이유는 스프링 MVC 프레임워크가 모델에 추가한 속성을 JSP 코드에서 접근할 수 있게 HttpServletRequest에 옮겨주기 때문이다. 스프링 MVC 프레임워크는 모델 데이터를 뷰에서 접근할 수 있게 만들어준다.
📌 아래 서적의 내용을 정리한 글입니다.
'프로그래밍 > Spring' 카테고리의 다른 글
[Spring] Auto-wiring (0) | 2022.04.25 |
---|---|
[Spring] DI - XML 기반 설정 (0) | 2022.04.24 |
[Spring] Spring MVC(2) (0) | 2022.04.22 |
[Spring] Spring DI (0) | 2022.04.01 |