스프링을 사용하는 이유

스프링이 지원하는 웹 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
복사했습니다!