티스토리 뷰

Web

Ch9. 스프링 MVC

tose33 2022. 7. 11. 17:24

지금까지 JetBrains의 Intellij IDE를 썼었는데, 찾아보니까 무료버전인 community edition은 서버 추가가 안된다고 한다. 

따라서 이번 챕터는 eclipse를 쓰기로 했다.

또한 eclipse가 기존에 ecllipse for java developer 로 설치되어 있었는데 웹 구현을 위해서는 eclipse ide for java ee developer로 설치해야 한다. 

 

MVC (Model View Controller)

Model : data를 처리하는 영역 

View : 결과 화면을 만들어내는 영역 

Controller : 웹의 요청을 처리, View와 Model의 중간 다리 역활. User가 데이터를 클릭하고 수정하는 등의 이벤트들을 처리.

 

스프링 MVC를 위한 설정

MvcConfig.java에서 @EnableWebMvc와 WebMvcConfigurer 인터페이스를 이용해 설정한다.

web.xml에서 웹 요청에 응답하는 DispatcherServlet을 설정한다.

 

sp5-chap09/src/main/java/config/MvcConfig.java 

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");
	}

}

MvcConfig 클래스는 스프링 MVC의 다양한 구성요소들을 설정하는 클래스다. 

 

@EnableWebMvc 애노테이션은 스프링 MVC를 사용하는데 필요한 기본적인 다양한 설정을 생성해준다. 

이게 없다면 많은 설정들을 일일히 처리해 줘야 한다. 

DispatcherServlet은 컨트롤러(핸들러)를 찾고, 실행하기 위해 HandlerMapping과 HandlerAdapter를 사용하기 때문에, 핸들러

에 알맞은 이 두 타입의 빈이 스프링 설정에 등록되있어야 한다. 

@EnableWebMvc가 해주는 기본적인 다양한 설정에 이것이 포함된다. 

 

 

MvcConfig 클래스는 WebMvcConfigurer 인터페이스를 구현한다.

@EnableWebMvc가 기본적인 설정을을 생성해주고, WebMvcConfigurer에서 개별 설정을 조정한다.

MvcConfig 클래스에는 @Configuration 애노테이션이 있고 WebMvcConfigurer 인터페이스를 구현한다, 이는 해당 클래스가 WebMvcConfigurer 빈 객체가 됨을 의미한다.

 

@EnableWebMvc는 WebMvcConfigurer 타입의 빈 객체의 메서드를 호출해서 MVC 설정을 추가한다.

즉 WebMvcConfigurer 인터페이스를 구현한 설정 클래스는 configureViewResolver() 를 재정의해 뷰 관련 설정을 추가하면 된다.

 

 

configureViewResolvers 메소드는 WebMvcConfigurer 인터페이스에 정의된 메서드다. 

registry.jsp() 는 JSP를 이용해 컨트롤러의 실행 결과를 보여주도록 한다. 

registry.jsp("/WEB-INF/view/", ".jsp") 는 JSP를 뷰 구현으로 사용할 수 있도록 해주는 설정이다. 

첫번째 인자는 jsp 파일 경로의 접두어이며 두 번째 인자는 접미사이다. 

즉 뷰의 이름과 JSP 파일의 이름을 연결해주는 것이다. 

 

configureDefaultServletHandling은 @Controller로 등록되지 않은 경로를 처리한다. 

HandlerMapping이 핸들러(컨트롤러)를 찾을때는 @Controller 에 @GetMapping(경로)로 경로로 등록된 경로만 처리할수 있기 때문에 "/index.html" 이나 "/css/bootstrap.css" 같이 등록되지 않은 (등록하지 않았다면) 경로를 처리하는 핸들러 객체를 찾을수가 없다. 

이럴때 configureDefaultServletHandling() 메서드가 이런것들을 처리해준다. 

 

 

@GetMapping()으로 경로 지정

 

sp5-chap09/src/main/webapp/WEB-INF/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>

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

DispatcherServlet은 웹이 요청한 경로를 받아 이를 처리할 컨트롤러를 찾는다. 

 

web.xml을 보면 10~13행이 DispatcherServlet을 dispatcher라는 이름으로 등록하고 있다.

그후 ContextClass로 AnnotationConfigWebApplicationContext를 등록한다.

그 다음 ContextConfigLocation의 값을 config.MvcConfig, config.ControllerConfig를 줘서 경로를 지정하고 있다.

 

ContextConfigLocation은 스프링 설정 클래스들의 경로를 뜻한다.

위에서 지정한 config.MvcConfig, config.ControllerConfig 모두 스프링 설정 클래스다.

DispatcherServlet은 웹의 요청을 처리할 컨트롤러를 구하고, 처리 결과를 보여줄 뷰를 찾는데 스프링 빈이 필요하다.

따라서 DispatcherServlet은 스프링 컨테이너의 위치를 알필요가 있기 때문에 이렇게 전달해 주는 것이다. 

 

 


컨트롤러

스프링 MVC에서 컨트롤러란 웹 요청을 처리하고 그 결과를 뷰에 전달하는 스프링 빈 객체이다.

 

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 // 해당 클래스는 스프링 MVC에서 컨트롤러로 사용 
public class HelloController 
{
	//메서드가 처리할 요청 경로 지정 
	@GetMapping("/hello")
	public String hello(Model model, 
			@RequestParam(value = "name", required = false) String name)	
	{
		model.addAttribute("greeting", "안녕하세요, " + name);
		return "hello";
	}
}

 

@Contoller 애노테이션을 적용한 클래스는 스프링 MVC에서 컨트롤러로 사용된다.

 

@GetMapping("/hello") 애노테이션은 메서드가 처리할 요청 경로를 지정한다. 

컨텍스트 경로를 기준으로 하는데, (컨텍스트 경로란 웹 어플리케이션을 구분하기 위한 경로다) 톰캣의 경우 webapp 아래다.

즉 여기서 컨텍스트 경로는 /sp5-chap09 이다. 

따라서 @GetMapping("/hello")가 처리하는 경로는 http://host/sp5-chap09/hello 이다.

 

hello 메서드의 Model 파라미터는 컨트롤러의 처리 결과를 뷰에 전달한다.

model.addAttribute(attributeName, attrubuteValue) 는 모델 속성에 값을 설정한다. 

여기서는 어트리뷰트 이름을 greeting, 값을 "안녕하세요, " + name)으로 전달하고 있다. 

이 Model 객체는 View 객체에 응답 생성을 요청할때 사용된다. 

 

 

컨트롤러가 처리한 결과는 HandlerAdapter에 리턴되고, HandlerAdapter가 ModelAndView 로 변환해서 DispatcherServlet에게 리턴한다. HelloController의 hello 메서드는 리턴 타입이 String인데, 이때는 해당 문자열 값을 뷰 이름으로 갖는 ModelAndView 객체를 생성해 리턴한다. 

 

 

이렇게 작성한 @Contoller 가 붙은 Controller 클래스는 빈 객체로 만들어야 한다. 

package config;

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Bean;
import chap09.HelloController;

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

 


JSP 구현 

컨트롤러가 생성한 결과를 보여줄 뷰 코드는 JSP (java server page)로 만든다. 

 

<%@ page contentType="text/html; charset=utf-8" %>
<!DOCTYPE html>
<html>
<head>
	<title>Hello</title>
</head>

<body>
	인사말: ${greeting}
</body>
</html>

 

서버 실행

 


 

MvcConfig.java 에서 설정하고, 컨트롤러를 만들고, jsp로 뷰를 처리했다. 

아직까지 정확한 흐름이 잘 보이지 않는다.

다음 장이 스프링 MVC 프레임워크 동작 방식 이니까 다음장을 보고 다시 정확히 정리해 봐야 겠다. 

 

 

출처 : 스프링5 프로그래밍 입문 (최범균 저) 

'Web' 카테고리의 다른 글

Ch11. MVC 1 : 요청 매핑  (0) 2022.07.12
Ch10. 스프링 MVC 프레임워크 동작 방식  (0) 2022.07.11
Ch8. 스프링의 DB 정리  (0) 2022.07.11
Ch8. 스프링의 트랜잭션 관리  (0) 2022.07.09
mysql 연동 에러들  (0) 2022.07.08
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
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
글 보관함