- Outsider's Dev Story
- 흔한 개발자의 개발 노트
- 내 아이큐 80, 너도 80, 둘이 합쳐 160 - 내…
- 조대협의 블로그
- 자바캔(Java Can Do IT) / 최범균 님
- Sangon, Han – 개발자; 읽고 생각하고 쓰고 …
- The Evolution of the Web
- NAVER D2
- Dashboard - SLiPP
- ITWorld Korea - 테크놀로지 리더를 위한 글…
- OKKY - All That Developer
- 웹Frameworks
- 오픈튜토리얼스
- 위키독스 / 온라인 책 제작 공유 플랫폼 서비스
- 블로터
- IT OnAir
- 한 처음에 / 백창92
- Divide my knowledge / 완프최
- SERI.org
Bigfat
[Spring] Overview of Spring MVC Architecture 본문
스프링 MVC 구조에 대해 간략히 알아보자
아래는 이전에 모델2 구조로 구현했던 게시판(BBS)을 스프링 MVC구조(Model-View-Controller Architecture)로 재구현한 프로젝트의 구조를 볼 수 있다.
먼저 /WEB-INF/web.xml을 살펴보자. 기존의 프로젝트에서는 클라이언트의 요청(GET, POST)을 받았을 때 init()메서드로 properties파일을 읽고, **Impl클래스들의 인스턴스들을 생성한다. 그리고 요청을 처리할 인스턴스의 메서드를 실행시켜 return값(/*.jsp)을 얻어 RequestDispatcher클래스의 메서드를 통해 클라이언트에게 요청에 대한 화면을 출력해주게 된다(BBSServlet.java 참고).
스프링에서는 기존 프로젝트에서 개발자가 작성한 servlet을 appServlet이라는 이름의 DispatcherServlet이 담당하게 된다. 그리고 이 servlet의 초기 파라미터(init-param)들은 servlet-context.xml에 작성한다. load-on-startup을 설정하여 서블릿이 로딩되는 시점을 정할 수 있는데, 0이거나 0보다 큰 정수일 때 오름차순으로 로딩된다(참고1).
그리고 context-param이 contextConfigLocation라는 이름으로, 값(value)은 /WEB-INF/spring/root-context.xml로 정의되어 있다. 이 컨텍스트 파라미터는 컨텍스트, 즉 애플리케이션에서 공유되어 사용하는 자원을 root-context.xml에 작성하여 사용할 수 있다. 공유 자원으로는 예를 들면 기존 프로젝트의 pageSize, pageBlock이나 파일 업로드 디렉토리 등이 있다. JSP에서는 application 내장 객체로, Java에서는 request.getServletContext().getInitParameter()로 값을 얻을 수 있다. 참고로 JSP application 내장 객체의 타입은 ServeltContext이다.
appServlet의 url-pattern은 기존 프로젝트와 동일하게 *.bbs로 변경하였다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <!-- 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> <!-- 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>*.bbs</url-pattern> </servlet-mapping> </web-app> | cs |
서버를 실행하면 콘솔에 서버 구동 정보들이 뜨는데, appServlet으로 찾아보니 아래와 같은 정보를 확인할 수 있었다. appServlet이 배치(deploy)될 때, 즉 컨텍스트가 인식될 때 서블릿이 로딩되는 것을 알 수 있다.
4월 17, 2017 8:36:32 오후 org.apache.catalina.core.ApplicationContext log 정보: Initializing Spring FrameworkServlet 'appServlet' INFO : org.springframework.web.servlet.DispatcherServlet - FrameworkServlet 'appServlet': initialization started INFO : org.springframework.web.context.support.XmlWebApplicationContext - Refreshing WebApplicationContext for namespace 'appServlet-servlet': startup date [Mon Apr 17 20:36:32 KST 2017]; parent: Root WebApplicationContext INFO : org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from ServletContext resource [/WEB-INF/spring/appServlet/servlet-context.xml]
아래는 Spring MVC Architecture다. DispatcherServlet은 *.bbs(서블릿과 맵핑된 URL패턴)에 대한 요청을 받고, 작업(task)을 HandlerMapping, HandlerAdapter, ViewResolver순으로 보내서 클라이언트 요청(Request)에 대한 응답(Response)을 처리하게 된다.
Request Life cycle (출처 http://terasolunaorg.github.io)
[Spring Framework 4.3.7.RELEASE API 참고]
[[Spring MVC] 스프링 MVC 구성요소 참고]
[서블릿 load-on-startup 참고1]
'Java > web' 카테고리의 다른 글
[Spring] 스프링이 지원하는 JdbcTemplate 사용하기 (게시판 구현) (2) | 2017.04.18 |
---|---|
[Spring] 스프링 MVC 구조로 게시판 구현하기 (댓글 제외) (0) | 2017.04.18 |
[Spring] 스프링 프로젝트 생성 및 웹 애플리케이션 실행하기 (0) | 2017.04.17 |
[Web] Ajax를 이용한 댓글 쓰기 구현하기 (게시판 구현) (10) | 2017.04.13 |
[Web] 답글 쓰기 구현하기 (게시판 구현) (1) | 2017.04.13 |