[spring] 스프링 MVC의 기본 구조
업데이트:
스프링 MVC는 스프링의 서브(sub) 프로젝트이다. 스프링은 하나의 기능을 하기 위해 만들어진 프레임워크가 아니라 코어
라고 할 수 있는 프레임워크에 여러 서브 프로젝트를 결합해서 다양한 상황에 대처할 수 있도록 개발되었다.
스프링 MVC 프로젝트의 내부 구조
스프링 MVC를 구성하면 내부적으로는 root-context.xml로 사용하는 일반 Java 영역과 Servlet-context.xml로 설정하는 Web 관련 영역을 같이 연동해서 구동하게 된다.
이클립스에서 Spring Legacy Project
를 이용해서 ‘ex01’ 프로젝트를 생성한다. 여기에서 Templates는 Spring MVC Project
를 선택한다.
Spring MVC Project를 클릭하고 Next를 누르면 아래와 같은 팝업이 뜬다. Spring MVC Project를 이용하기 위해서 추가적으로 다운받아야 할 것들을 다운 받을거냐 물어보는거라 ‘Yes’를 눌러주면 된다
패키지는 기존과 똑같은 패키지명을 사용하면 된다.
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으로 프로젝트를 실행해서 오류 없이 잘 실행되는지 확인한다.
웹 프로젝트는 가능하면 절대 경로
를 이용하는 구조를 사용하는 것이 바람직하므로 Tomcat의 설정을 변경한다.
Servers에서 Tomcat 더블 클릭 > Modules 탭 > Edit… > Web Project Settings 속성을 /
로 지정
변경 후에 다시 실행해서 주소를 확인한다.
예제 프로젝트의 로딩 구조
프로젝트 구동 시 관여하는 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는 해당 웹 애플리케이션 구동 시 같이 동작한다.
- web.xml 상단에는 가장 먼저 구동되는
- 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 위에 하나의 계층을 더한 형태가 된다.
개발자의 코드는 스프링 MVC에서 동작하기 때문에 과거의 스프링 MVC의 특정한 클래스를 상속하거나 인터페이스를 구현하는 형태로 개발할 수 있었지만, 스프링 2.5버전부터 등장한 어노테이션 방식으로 인해 최근 개발에서는 어노테이션
이나 XML
등의 설정만으로 개발이 가능하게 되었다.
모델 2와 스프링 MVC
스프링 MVC는 모델 2
방식으로 처리되는 구조이다. 모델 2방식은 로직과 화면을 분리하는 스타일의 개발 방식이다.
- 사용자의 Request는
Front-Controller
인 DispatcherServlet을 통해서 처리한다. - HandlerMapping은 Request의 처리를 담당하는 컨트롤러를 찾기 위해서 존재한다. HandlerMapping 인터페이스를 구현한 여러 객체 중 RequestMappingHandlerMapping 같은 경우 개발자가
@RequestMapping
어노테이션이 적용된 것을 기준으로 판단한다. - HandlerMapping으로 적절한 컨트롤러가 찾아졌다면 HandlerAdapter를 이용해서 해당 컨트롤러를 동작시킨다.
- Controller는 개발자가 작성하는 클래스로 실제 Request를 처리하는 로직을 작성한다. 이때 View에 전달해야 하는 데이터는 주로
Model
이라는 객체에 담아서 전달한다. Controller는 다양한 타입의 결과를 반환하는데 이에 대한 처리는ViewResolver
를 이용한다. - ViewResolver는 Controller가 반환한 결과를 어떤 View를 통해서 처리하는 것이 좋을지 해석하는 역할이다. 가장 흔하게 사용하는 설정은 Servlet-context.xml에 정의된 InternalResourceViewResolver이다.
- View는 실제로 응답 보내야 하는 데이터를 JSP 등을 이용해서 생성하는 역할을 하게 된다.
- 만들어진 응답은 DispatcherServlet을 통해서 전송된다.
모든 Request는 DispatcherServlet을 통하도록 설계된다. 이런 방식을 Front-Controller
패턴이라 한다. 이 패턴을 이용하면 전체 흐름을 강제로 제한할 수 있다. 그렇기 때문에 모든 Request의 처리에 대한 분배가 정해진 방식대로만 동작하기 때문에 좀 더 엄격한 구조를 만들어 낼 수 있다.
- 참고 : 코드로 배우는 스프링 웹 프로젝트
댓글남기기