Day83 - [Spring]mvc 구조 이해하기

2021. 6. 15. 02:09Spring

이번에는 Spring freamwork mvc 구조를 이해 해봅시다.

 

mvc

mvc 는 Model, View, Controller 로써, 각각의 기능을 가지고 있습니다.

 

Model : 데이터의 집합 ( 데이터는 Model 이 가지고 있습니다 )

View : 사용자에게 보여지는 화면 입니다.

Controller : Model 과 View 를 왔다 갔다하면서 어떤 기능을 수행하는지 등의 로직 컨트롤러 입니다.

 

기본적으로 Spring의 mvc 구조를 이해하기 위해서는, JSP의 MVC2 를 학습하고 오는 편이 이해하기가 쉽습니다.

 

JSP 에서 mvc2 는 URL 매핑을 통해서, Servlet 과 연결하고, Servlet 에 Controller 를 만들어서, 각각의 기능을 하는 서비스를 만듭니다.

 

Controller 는 어떤 URL 을 통해서 접근했는지에 따라서, 어떤 기능(서비스) 을 실행할지를 정하고, 필요하다면 데이터(모델) 에 접근해서 데이터의 추가, 수정, 삭제 등을 합니다.

 

서비스에서 이러한 과정들을 마쳤다면, 모델에서 가지고 나온 데이터가 있다면, Dispatcher 를 이용해서 forward 를 통해 View 화면으로 넘겨줍니다.

 

View 에서는 Controller 를 통해서 넘어온 데이터를 화면에 나타냅니다.

 

전체적으로 이러한 구조를 가진 JSP MVC2 를 Spring 에서도 사용하게 되는데요

 

Spring 에서는 아래의 구조를 가지고 있습니다.

Spring 에서는 DispatcherServlet , HandlerMapping, HandlerAdapter, ViewResolver 을 처음에 설정한 후에는 알아서 작동을 하게 되고, 저희가 할 것은, Controller, Moder, View 를 짜는 것만 하면 됩니다.

 

그래도, 기본적으로 Spring 의 mvc 구조를 알고 있어야 효율적인 코딩을 할 수 있다고 해요.

 

1. 클라이언트의 요청 -> DispatcherServlet : 클라이언트(사용자) 로부터 어떠한 입력(요청)이 들어오면, DispatcherServlet 이 클라이언트의 요청을 가져갑니다. ( URL 매핑 )

 

2. DispatcherServlet -> HandlerMapping : DispatcherServlet 은 클라이언트의 요청에 맞는 Controller 를 찾아달라고 HandlerMapping 에게 부탁합니다.

 

3. HandlerMapping -> HandlerAdapter : 요청을 수행하기 위해 알맞는 Controller 를 검색한 HandlerMapping 은 HandlerAdapter 에게 요청에 알맞은 컨트롤러의 메서드를 실행을 요청하게 됩니다.

 

4. HandlerAdapter -> Controller -> Service -> Model : Controller 는 HandlerAdapter 의 요청에 따라 정해진 Bussiness 로직을 실행하게 됩니다 ( Controller -> Service -> Model ) 

 

5. Controller -> HandlerAdapter : Controller 는 메서드를 실행한 후에 HandlerAdapter 에게 사용자 응답에 필요한 데이터 정보와 뷰정보(JSP파일)가 담겨있는 ModelAndView 객체를 반환 합니다.

 

6. HandlerAdapter -> DispatcherServlet -> ViewResolver : ModelAndView 객체를 DispatcherServlet 에게 넘깁니다. DispatcherServlet 은 ViewResolver 에게 어떤 View 로 갈 것인지 물어 봅니다.

 

7. ViewResolver -> View : ViewResolver 는 1~6 까지의 과정들을 통해서 넘어온 데이터가 어떤 View 에서 사용될 것인지 정하고 , 정해진 View 로 넘어가서 사용자에게 보여지는 화면을 나타냅니다.

 

위의 이러한 일련의 과정들을 프로젝트로 만들어 봅시다

먼저, mvc 는 서버를 통해서 작동을 하기 때문에, 서버를 사용합니다.

 

저희는 앞서 JSP 에서 사용했던 것 처럼 Tomcat 을 사용합니다.

 

Tomcat 을 서버에 연결하고, "Dynamic Web Project" 를 생성합니다.

※ 프로젝트를 만드는데 다소 시간이 소요됩니다.

프로젝트가 만들어졌다면 아래의 그림처럼 만들어 집니다.

프로젝트가 완성 되었다면, 프로젝트의 우클릭 한 후에 아래처럼 Maven Project 로 변경합니다.

Group Id : 회사이름

Artifact Id : 프로젝트 이름

Version : 0.0.1 -SNAPSHOT

paclagomg : war

 

Maven 프로젝트로 변경하게 되면 구조가 아래처럼 변경 됩니다.

"pom.xml" 에 다음과 같이 써줍니다.

<project xmlns="http://maven.apache.org/POM/4.0.0" 
		 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
		 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
         			https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.simple</groupId>
  <artifactId>SpringTest</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  
  <!-- 자바 버전 or 스프링 버전을 통일해서 사용할 수 있도록 변수 선언 -->
  <properties>
  	<java-version>1.8</java-version>
  	<org.springframework-version>5.0.7.RELEASE</org.springframework-version>
  </properties>
  
  <!-- pom.xml 은 dependency 태그를 이용해서 원격에 저장소에서 필요한 라이브러리를 다운로드 -->
  <dependencies>
  	<!-- 스프링 설정, 코어 -->
  	<dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-context</artifactId>
	    <version>${org.springframework-version}</version>
	</dependency>
	<!-- 스프링 web mvc 모듈 -->
	<dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-webmvc</artifactId>
	    <version>${org.springframework-version}</version>
	</dependency>
	
  </dependencies>
  
  <!-- 메이븐 빌드 툴 -->
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <source>${java-version}</source>
          <target>${java-version}</target>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.2.3</version>
        <configuration>
          <warSourceDirectory>webapp</warSourceDirectory>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

"pom.xml" 을 수정완료 했다면, 저장한 후에 프로젝트 우클릭을 한 후 업데이트 시켜 줍니다.

"Libraries" 에 Maven Dependencies 가 생성이 되었다면 완료 입니다.

"web.xml" 파일에 아래의 코드를 작성합니다.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">

	<!-- 스프링 클래스를 디스패처 서블릿 등록 -->
	<servlet>
		<servlet-name>appServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<!-- 시작 파라미터 값으로 스프링 설정파일을 지정. -->
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/config/spring-servlet.xml</param-value>
		</init-param>
	</servlet>

	<!-- 모든 요청에 대해서 appServlet을 연결한다 -->
	<servlet-mapping>
		<servlet-name>appServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

</web-app>

 

"webapp" 폴더 아래에 "resource" 폴더를 만듭니다.

 

 

"WEB_INF" 폴더 아래에 "config" 폴더를 만들고, "spring-servlet.xml" 파일을 만듭니다.

"spring-servlet.xml" 파일 안에 아래와 같은 코드를 작성합니다.

<?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:mvc="http://www.springframework.org/schema/mvc"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
	http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
	
	<!-- 핸들러 어댑터, 핸들러 맵핑, 스프링의 다양한 어노테이션기능을 활성화 -->
	<mvc:annotation-driven />
	
	<!-- 정적자원 맵핑 경로 설정 css, js, html파일은 직접 경로로 맵핑 -->
	<mvc:resources location="/resource/" mapping="/resource/**"></mvc:resources>
	
	<!-- 뷰 리졸버 - controller 에서 돌아온 문자열 경로를 최종적으로 합성해주는 역할 -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/jsp/" />
		<property name="suffix" value=".jsp" />
	</bean>
	
	
	<!-- 컨트롤러 패키지를 읽어서 bean 으로 생성 -->
	<context:component-scan base-package="com.simple.controller" />

</beans>

"Java Resources" -> "src/main/java" 폴더 아래에 패키지를 만들고, 컨트롤러를 만들어 줍니다.

컨트롤러에는 아래처럼 만들어 줍니다.

"WEB-INF" 폴더 아래에 "jsp" 폴더를 만들고, "home.jsp" 폴더를 만들어 줍니다.

"home.jsp" 파일에는 hello 월드를 적어 줍시다.

서버를 실행하고 "localhost:포트번호/프로젝트명/" 을 쳤을 때 아래처럼 나오면 됩니다.