Spring/Maven Project

Spring에 DispatcherServlet 적용 (Servlet, Component-Scan, ViewResolver), Controller 추가

carrotweb 2022. 9. 6. 22:06
728x90
반응형

스프링 프레임워크(Spring Framework)의 DispatcherServlet에 대해 알아보겠습니다.

 

Spring Framework Web MVC에서는 DispatcherServlet이 Central Servlet(중앙 서블릿)으로 Controller 역할을 하여 모든 요청(Request)을 받고 요청 URL과 매핑된 Controller로 연결시켜(서비스별로 분산시켜) 주고 처리된 결과(Model)를 화면(View)으로 처리(Rendering) 하여 응답(Response) 합니다.

 

 

웹 브라우저 요청부터 응답까지 처리되는 순서는 다음과 같습니다. 

Web Browser → Request(요청) → 해당 요청을 매핑한 컨트롤러 검색 → 컨트롤러 처리(View 이름 리턴) → View 검색 → View 처리 →  Response(응답) → Web Browser

 

Spring Framework Web MVC에서 처리되는 순서는 다음과 같습니다.

Client → DispatcherServlet → HandlerMapping → HandlerAdapter → Controller → DispatcherServlet → ViewResolver → View → DispatcherServlet → Client

 

DispatcherServlet에 대한 자세한 설명은 "스프링 프레임워크 웹 MVC(모델, 뷰, 컨트롤러) 패턴 - https://carrotweb.tistory.com/218?category=1067583"을 참고하시기 바랍니다.

 

 

Maven Spring Project에 Spring Framework DispatcherServlet 적용하기

 

1. Spring Framework Web MVC의 DispatcherServlet를 적용하기 위해 web.xml 파일의 <web-app>에 <servlet>으로 DispatcherServlet을 추가합니다.

 

  1. servlet 이름을 입력하고 클래스를 Spring Framework Web MVC의 DispatcherServlet로 입력합니다.
  2. contextConfigLocation으로 DispatcherServlet에 대한 입력 정보들이 있는 파일의 위치를 입력합니다.
  3. servlet-maping에서 요청 URL이 ".do"로 끝나는 것 만 DispatcherServlet으로 처리하기 위해서 <url-pattern>에 "*.do"로 입력합니다. DispatcherServlet이 요청 URL과 매핑된 Controller을 연결시켜 주기 때문에 요청 URL과 확장자를 마음대로 만들 수 있습니다. 그래서 요청 URL의 끝이 ".do"가 아닌 ".edu", ".ins"로도 할 수 있습니다.
<servlet>
	<servlet-name>StudyTest1Servlet</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<init-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/config/dispatcher-servlet.xml</param-value>
	</init-param>
	<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
	<servlet-name>StudyTest1Servlet</servlet-name>
	<url-pattern>*.do</url-pattern>
</servlet-mapping>

 

2. WEB-INF 폴더에 config 폴더 생성하고 생성된 config 폴더에 dispatcher-servlet.xml 파일 생성합니다.
dispatcher-servlet.xml 파일에서 설정할 수 있는 annotation-driven, component-scan, ViewResolver에 대해 알아보겠습니다.

 

annotation-driven

  • 클래스에 있는 Annotation(어노테이션)들이 동작되도록 처리해 줍니다.

 

component-scan

  • base-package에 설정된 네임스페이스 이하의 모든 클래스를 스캔하여 클래스에 @Component, @Controller, @service, @Repository와 같은 Annotation(어노테이션)이 있으면 자동으로 Bean으로 생성합니다.

 

ViewResolver

  • DispatcherServlet으로부터 경로가 포함된 View 이름을 받아 View 이름과 매핑된 View 객체를 찾아 반환합니다.
  • ViewResolver가 등록되지 않으면 기본으로 InternalResourceViewResolver가 사용됩니다.

ViewResolver 클래스 종류

  • InternalResourceViewResolver : JSP 뷰 객체를 반환합니다.
  • BeanNameViewResolver  : 뷰 이름과 동일한 이름을 갖는 빈 객체를 뷰 객체로 사용합니다.
  • ResourceBundleViewResolver : 리소스번들(프로퍼티파일)을 이용하여 뷰 객체를 반환합니다.
  • XmlViewResolver : 뷰 객체 매핑을 위해 XML 파일 사용합니다.

 

component-scan만 적용해도 MVC 컴포넌트들이 Bean으로 생성하는데 문제가 없기 때문에 dispatcher-servlet.xml 파일에는 component-scan과 ViewResolver를 설정하겠습니다.

 

component-scan 설정

  1. base-package에 "com.home.study"로 입력합니다. 이제부터 만들어지는 Java 파일들은 "com.home.study" 패키지안에 있어야 합니다.

ViewResolver 설정

  1. ViewResolver의 기본 클래스로 InternalResourceViewResolver를 입력합니다.
  2. prefix에 "/WEB-INF/views/"를 입력하여 Controller에서 리턴되는 JSP 경로 앞에 자동으로 붙여지도록 합니다. 그래서 JSP 파일들은 "/WEB-INF/views/" 폴더 밑에 있어야 사용 가능합니다.
  3. suffix에 ".jsp"를 입력하여 Controller에서 리턴되는 JSP 경로 뒤에 자동으로 ".jsp"가 붙여지도록 합니다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xmlns:context="http://www.springframework.org/schema/context"
		xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
			http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
	
	<context:component-scan base-package="com.home.study"/>
	
	<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/views/"/>
		<property name="suffix" value=".jsp"/>
	</bean>
</beans>

 

annotation-driven를 적용하신다면 다음과 같이 해주시면 됩니다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xmlns:context="http://www.springframework.org/schema/context"
		xmlns:mvc="http://www.springframework.org/schema/mvc"
		xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
			http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
			http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd">

	<mvc:annotation-driven />
	
	<context:component-scan base-package="com.home.study"/>
	
	<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/views/"/>
		<property name="suffix" value=".jsp"/>
	</bean>
</beans>

 

 

 

Maven Spring Project에 Controller 추가하기

 

1. Java Resource > src/main/java에 com.home.study.test1.main.controller 패키지를 생성합니다.

  1. component-scan에서 설정한 base-package가 "com.home.study"임으로 src/main/java에 com 패키지 생성 → com 패키지에 home 패키지 생성 → home 패키지에 study 패키지 생성
  2. 프로젝트를 구분하기 위해서 study 패키지에 test1 패키지 생성
  3. 컨트롤을 구분하기 위해서 test1 패키지에 main 패키지 생성 → main 패키지에 controller 패키지 생성

 

2. com.home.study.test1.main.controller 패키지에 MainController 클래스를 생성합니다. (MainController.java 파일)

  1. 생성된 MainController 클래스가 Spring Framework Web MVC의 Controller로 처리되게 하기 위해서 클래스 위에 @Controller Annotation(어노테이션)을 추가합니다.
  2. 요청 URL이 왔을 때 실행될 mainIndex 메서드를 생성합니다. 파라미터로 HTTP 요청을 처리할 수 있는 HttpServletRequest request와 HTTP 응답을 처리할 수 있는 HttpServletResponse response, 웹 페이지로 정보를 전달할 수 있는 ModelMap model을 추가합니다.
  3. 요청 URL이 "/index.do"가 왔을 때 mainIndex 메서드가 실행될 수 있게 메서드 위에 @RequestMapping Annotation(어노테이션)을 추가합니다. (@RequestMapping Annotation(어노테이션)에는 요청 URL에서 ".do"를 제외한 경로를 입력합니다.)
  4. mainIndex 메서드의 리턴 값은 JSP 파일 경로입니다. dispatcher-servlet.xml 파일에서 설정한 ViewResolver의 prefix  값("/WEB-INF/views/")과  suffix 값(".jsp")을 제외한 JSP 파일 경로를 입력합니다. 리턴 값이 "main/main"임으로 실제로 ViewResolver에서는 "/WEB-INF/views/main/main.jsp" 파일을 읽어 처리합니다. 만약, ViewResolver가 설정되어 있지 않는다면 JSP의 전체 경로("/WEB-INF/views/main/main.jsp" )로 입력해야 합니다.
@Controller
public class MainController {

	@RequestMapping("/index")
	public String mainIndex(HttpServletRequest request, HttpServletResponse response, ModelMap model) {
		return "main/main";
	}
}

 

 

Maven Spring Project에 JSP 추가하기

 

1. WEB-INF 폴더에 views 폴더를 생성하고 생성된 views 폴더에 main 폴더를 생성합니다.

 

2. main 폴더에 main.jsp 파일을 생성합니다. 간단하게 Hello World가 나오도록 작성합니다.

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>Hello World</title>
	</head>
	<body>
		Hello World
	</body>
</html>

 

 

Maven Spring Project를 실행하여 웹 브라우저로 확인하기

 

웹 개발 테스트는 Tomcat 9.0.43를 사용하도록 하겠습니다.

Tomcat 9.0.43이 설치되지 않으셨다면 Tomcat 9.0.43를 설치하기 바랍니다.

Tomcat 9.0.43 다운로드와 설치에 대한 자세한 설명은 "이클립스 톰캣 9 설치(인스톨러) - https://carrotweb.tistory.com/30?category=1067711"와 "이클립스 톰캣 9 서버 설정 - https://carrotweb.tistory.com/31?category=1067711"를 참고하시기 바랍니다.

 

1. "Servers"탭에서 "Tomcat9"를 선택하고 "start"버튼(start the server)을 클릭하면 Tomcat이 실행됩니다.

 

2. 웹 브라우저에서 "http://localhost:9000/index.do"를 입력합니다.

 

정상적으로 생성된 웹 페이지가 나오는 것을 확인할 수 있습니다.

728x90
반응형