[spring] 스프링 MVC의 기본 구조

업데이트:



스프링 MVC는 스프링의 서브(sub) 프로젝트이다. 스프링은 하나의 기능을 하기 위해 만들어진 프레임워크가 아니라 코어라고 할 수 있는 프레임워크에 여러 서브 프로젝트를 결합해서 다양한 상황에 대처할 수 있도록 개발되었다.

스프링 MVC 프로젝트의 내부 구조

스프링 MVC를 구성하면 내부적으로는 root-context.xml로 사용하는 일반 Java 영역과 Servlet-context.xml로 설정하는 Web 관련 영역을 같이 연동해서 구동하게 된다.



이클립스에서 Spring Legacy Project를 이용해서 ‘ex01’ 프로젝트를 생성한다. 여기에서 Templates는 Spring MVC Project를 선택한다.


mvc1


Spring MVC Project를 클릭하고 Next를 누르면 아래와 같은 팝업이 뜬다. Spring MVC Project를 이용하기 위해서 추가적으로 다운받아야 할 것들을 다운 받을거냐 물어보는거라 ‘Yes’를 눌러주면 된다

mvc2


패키지는 기존과 똑같은 패키지명을 사용하면 된다.



pom.xml 수정

  • 스프링 버전 5.0.7 버전으로 변경
<org.springframework-version>5.0.7.RELEASE</org.springframework-version> 


  • Lombok 라이브러리 추가
<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.8</version>
    <scope>provided</scope>
</dependency>


  • Servlet 3.1.0 버전으로 변경
<!-- Servlet -->
<!-- <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
</dependency> -->

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


  • Maven 컴파일 옵션 변경
<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>



모두 변경 후 프로젝트 우클릭 > Maven > Update Project 클릭


Tomcat으로 프로젝트를 실행해서 오류 없이 잘 실행되는지 확인한다.

mvc3


웹 프로젝트는 가능하면 절대 경로를 이용하는 구조를 사용하는 것이 바람직하므로 Tomcat의 설정을 변경한다.

Servers에서 Tomcat 더블 클릭 > Modules 탭 > Edit… > Web Project Settings 속성을 /로 지정

mvc4

mvc5


변경 후에 다시 실행해서 주소를 확인한다.

mvc6




예제 프로젝트의 로딩 구조

프로젝트 구동 시 관여하는 XML은 web.xml, root-context.xml, servlet-context.xml 파일이다.

  • web.xml : Tomcat 구동 관련 설정
  • root-context.xml, servlet-context.xml : 스프링 관련 설정


순서

  • web.xml부터 시작
    • web.xml 상단에는 가장 먼저 구동되는 Context Listener가 등록되어 있음.
    • <context-param>에는 root-context.xml의 경로가 설정되어 있음.
    • <listener>에는 MVC ContextLoaderListener가 등록되어 있음.
    • ContextLoaderListener는 해당 웹 애플리케이션 구동 시 같이 동작한다.
  • root-context.xml 처리
    • 파일에 있는 빈(Bean) 설정들이 동작
    • root-context.xml에 정의된 객체(Bean)들은 스프링의 영역(Context)안에 생성되고, 객체들 간의 의존성 처리
  • DispatcherServlet이라는 서블릿 관련 설정 동작
    • org.springframework.web.servlet.DispatcherServlet 클래스는 스프링 MVC 구조에서 가장 핵심적인 역할을 하는 클래스. 내부적으로 웹 관련 처리의 준비 작업을 진행하고, 이와 관련된 파일이 servlet-context.xml이다.
    • DispatcherServlet에서 XmlWebApplicationContext를 이용해서 serlvet-context.xml을 로딩하고 해석한다. 이 과정에서 등록된 객체(Bean)들은 기존에 만들어진 객체(Bean)들과 같이 연동되게 된다.





스프링 MVC의 기본 사상

스프링 MVC은 Servlet/JSP 위에 하나의 계층을 더한 형태가 된다.

mvc7


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





모델 2와 스프링 MVC

스프링 MVC는 모델 2 방식으로 처리되는 구조이다. 모델 2방식은 로직과 화면을 분리하는 스타일의 개발 방식이다.

  1. 사용자의 Request는 Front-Controller인 DispatcherServlet을 통해서 처리한다.
  2. HandlerMapping은 Request의 처리를 담당하는 컨트롤러를 찾기 위해서 존재한다. HandlerMapping 인터페이스를 구현한 여러 객체 중 RequestMappingHandlerMapping 같은 경우 개발자가 @RequestMapping 어노테이션이 적용된 것을 기준으로 판단한다.
  3. HandlerMapping으로 적절한 컨트롤러가 찾아졌다면 HandlerAdapter를 이용해서 해당 컨트롤러를 동작시킨다.
  4. Controller는 개발자가 작성하는 클래스로 실제 Request를 처리하는 로직을 작성한다. 이때 View에 전달해야 하는 데이터는 주로 Model이라는 객체에 담아서 전달한다. Controller는 다양한 타입의 결과를 반환하는데 이에 대한 처리는 ViewResolver를 이용한다.
  5. ViewResolver는 Controller가 반환한 결과를 어떤 View를 통해서 처리하는 것이 좋을지 해석하는 역할이다. 가장 흔하게 사용하는 설정은 Servlet-context.xml에 정의된 InternalResourceViewResolver이다.
  6. View는 실제로 응답 보내야 하는 데이터를 JSP 등을 이용해서 생성하는 역할을 하게 된다.
  7. 만들어진 응답은 DispatcherServlet을 통해서 전송된다.



모든 Request는 DispatcherServlet을 통하도록 설계된다. 이런 방식을 Front-Controller 패턴이라 한다. 이 패턴을 이용하면 전체 흐름을 강제로 제한할 수 있다. 그렇기 때문에 모든 Request의 처리에 대한 분배가 정해진 방식대로만 동작하기 때문에 좀 더 엄격한 구조를 만들어 낼 수 있다.





  • 참고 : 코드로 배우는 스프링 웹 프로젝트

태그:

카테고리:

업데이트:

댓글남기기