Sangwon Coding

5. 스프링 MVC의 기본 구조 본문

Spring/코드로 배우는 스프링 웹 프로젝트

5. 스프링 MVC의 기본 구조

SW1 2019. 11. 7. 21:46

안녕하세요! 스프링 MVC 기본 구조 포스팅 시작하겠습니다!

 

스프링MVC 프로젝트를 구설해서 사용한다는 의미는 내부적으로 root-context.xml로 사용하는 일반 Java 영역(흔히 POJO)과 servlet-context.xml로 설정하는 Web관련 영역을 같이 연동해서 구동하게 됩니다. 그림으로 간단히 보면 

 

 

 

바깥쪽에 있는 WebApplicationContext라는 존재는 기존의 구조에 MVC 설정을 포함하는 구조로 만들어집니다. 스프링은 원래 목적 자체가 웹 애플리케이션을 목적으로 나온 프레임워크가 아니기 때문에 달라지는 영역에 대해서는 완전히 분리하고 연동하는 방식으로 구현되어있습니다.

 

Eclipse(STS) 내 'Spring Legacy Project'를 이용해서 'ex01'프로젝트를 생성합니다. 프로젝트는 'Spring MVC Project'로 생성함. 패키지명도 기존과 동일하게 'org.zerock.controller'로 지정합니다.  기존에 해봤었던 것처럼 pom.xml 에서 스프링 버전을 5.0.7로 변경해주고 Lombok 기능도 추가해줍니다. 또한 javax.servlet 버전을 3.0 이상 쓰는 것이 좋기에 그것 또한 3.1.0 버전으로 수정하고 Maven의 컴파일 옵션도 1.8로 변경해줍니다. 변경사항 모두 적용하였으면 프로젝트의 'Maven' 메뉴에서 'update project'를 실행합니다.

 

	<properties>
		<java-version>1.8</java-version>
		<org.springframework-version>5.0.7.RELEASE</org.springframework-version>
		<org.aspectj-version>1.6.10</org.aspectj-version>
		<org.slf4j-version>1.6.6</org.slf4j-version>
	</properties>

 

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.18.0</version>
			<scope>provided</scope>
		</dependency>

 

		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>3.1.0</version>
		</dependency>

 

			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>2.5.1</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
					<compilerArgument>-Xlint:all</compilerArgument>
					<showWarnings>true</showWarnings>
					<showDeprecation>true</showDeprecation>
				</configuration>
			</plugin>

 

예제 프로젝트의 로딩 구조를 알아보자면 프로젝트가 실행할 때 나타나는 로그를 이용해서 어떤 과정을 통해서 프로젝트가 실행되는 지를 엿볼 수 있습니다. 프로젝트 구동 시 관여하는 xml은 web.xml, root-context.xml, servlet-context.xml 파일들 입니다. 이 파일들중 web.xml은 Tomcat 구동과 관련된 설정이고, 나머지 두 파일은 스프링과 관련된 설정입니다.

프로젝트의 구동은 web.xml에서 시작하고  web.xml의 상단에는 가장 먼저 구동되는 Context Listener가 등록되어 있습니다.

 

web.xml일부입니다.

 

<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->

    <context-param>

        <param-name>contextConfigLocation</param-name>

        <param-value>/WEB-INF/spring/root-context.xml</param-value>

    </context-param>

    

    <!-- Creates the Spring Container shared by all Servlets and Filters -->

    <listener>

        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

    </listener>

 

<context-param>에는 root-context.xml의 경로가 설정되어 있고, <listener>에는  스프링MVC의 ContextLoaderListener가 등록되어 있는 것을 볼 수 있습니다.

ContextLoaderListener는 해당 웹 애플리케이션 구동 시 같이 동작하므로 해당 프로젝트를 실행하면 다음과 같이 가장 먼저 로그를 출력하면서 기록하는 것을 볼 수 있습니다.

 

 

root-context.xml이 처리되면 파일에 있는 빈(Bean) 설정들이 동작하게 됩니다. 그림으로 표현하면  다음과 같습니다.

 

 

root-context.xml에 정의된 객체(Bean)들은 스프링의 영역(context) 안에 생성되고, 객체들 간의 의존성이 처리됩니다.

root-context.xml이 처리된 후에는 스프링MVC에서 사용하는 DispatcherServlet이라는 서블릿과 관련된 설정이 동작합니다.

 

web.xml 일부입니다.

 

<!-- Processes application requests -->

    <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/spring/appServlet/servlet-context.xml</param-value>

        </init-param>

        <load-on-startup>1</load-on-startup>

    </servlet>

        

    <servlet-mapping>

        <servlet-name>appServlet</servlet-name>

        <url-pattern>/</url-pattern>

    </servlet-mapping>

 

org.springframework.web.servlet.DispatcherServlet 클래스는 스프링 MVC의 구조에서 가장 핵심적인 역할을 하는 클래스 입니다.

내부적으로 웹 관련 처리의 준비작업을 진행하는데 이때 사용하는 파일이 servlet-context.xml입니다..

프로젝트가 실행될때 로그의 일부를 보면 아래 와 같습니다.

 

 

DispatcherServlet에서 XmlWebApplicationContext를 이용해서 servlet-context.xml을 로딩하고 해석하기 시작합니다. 

이과정에서 등록된 객체(Bean)들을 기존에 만들어진 객체(Bean)들과 연동되게 됩니다.

 

 

스프링은 모델2에 대한 부분은 개발자들에게 보여주지 않고, 개발자들은 자신이 필요한 부분만을 집중해서 개발할 수 있는 구조로 만들어져 있습니다.

웹 프로그래밍을 배워본 적이 있다면 가장 익숙한 단어들 중 하나는 Request / Response일 것입니다. Servlet / JSP에서는 HttpServletRequest / HttpServletResponse라는 타입의 객체를 이용해 브라우저에서 전송한 정보를 처리하는 방식입니다.

스프링MVC의 경우 이 위에 하나의 계층을 더한 형태가 됩니다.

 

 

스프링MVC를 이용하게 되면 개발자들은 직접적으로 HttpServletRequest / HttpServletResponse 등과 같이 Servlet/JSP의 API를 사용할 필요성이 현저하게 줄어듭니다.

스프링은 중간에 연결 역할을 하기 때문에 이러한 코드를 작성하지 않고도 원하는 기능을 구현할 수 있게됩니다.

 

개발자의 코드는 스프링MVC에서 동작하기 때문에 과거에는 스프링MVC의 특정한 클래스를 상속하거나 인터페이스를 구현하는 형태로 개발할 수 있었지만, 스프링 2.5버전 부터 등장한 어노테이션 방식으로 인해 최근 개발에는 어노테이션이나 XML등의 설정만으로 개발이 가능하게 되었습니다.

 

이상으로 포스팅을 마치고 다음 포스팅은 스프링 MVC의 Controller에 대해 포스팅하겠습니다!

Comments