2 minute read

개요

: 스프링 프로젝트의 MVC 처리과정에 대해서 알아본다.

  • 프로젝트: Spring Legacy Project
  • 템플릿: Spring MVC Project

구조

: 아래는 스프링 MVC 패턴에서 전체적으로 처리되든 일련의 과정이다.

상세
사진2

요약
사진3

MVC 처리

사진1

(1) 톰캣 서버 실행

  1. WAS가 구동되면 web.xml를 로딩한다.
  2. 로딩된 web.xml에서 ContextLoaderListener 클래스를 생성한다. (스프링 설정을 읽기위한 프레임웍동작의 기본이다.)
  3. 이때 리스너가 동작하기 위해 설정파일 위치를 알려줘야한다. 안에 contextConfigLocation이라고 해서 파라미터와 위치를 지정해 준다. (통상 root-context.xml)
  4. 생성된 ContextLoaderListener는 설정을 참조하여 root-context.xml 을 로딩한다. 그리고 root-context는 Context-param으로 선언되었기 때문에 WebApp 전역적으로 사용된다.
  5. 로딩된 root-context에 등록된 Spring 컨테이너가 구동되며 Service, dao, impl 등의 객체도 함께 생성된다.

(2) 클라이언트로부터 요청이 왔을 때

  1. url 패턴으로 들어온 요청을 DispatcherServlet 이 가로챈다.
  2. DispatcherServlet JAVA 클래스가 생성된다. (다른말로 스프링컨테이너 Spring Container 라고한다)
  3. DispatcherServlet 생성은 태그에 등록된 servlet-context.xml 을 기준으로 로딩된다.
  4. DispatcherServlet 생성은 이전에 전역으로 로딩한 root-context.xml 과 함께 협업하여 로딩한다.
  5. servlet-context.xml(Spring Container) 가 구동되며 Controller 들을 태그 같은 기능으로 Controller 클래스를 bean 객체로 만든다. 즉, 컨테이너(Container)에 bean으로 등록한다.

(3) 클라이언트 요청 처리

  1. HandlerMapping 를 수행하여 아까 만들어진 Controller 빈(bean) 객체 중 요청url 주소와 맞는 컨트롤러를 찾는다.
  2. 위 작업으로 컨트롤러를 찾았다면 HandlerAdapter 를 수행하고 컨트롤러를 연결하여 동작(실행) 한다. Ex) Controller ==> Service ==> DAO
  3. DispatcherServlet이 ModelAndView 객체를 받으면 ViewResolver 객체가 화면에 표시할 뷰 객체를 찾아 DispatcherServlet에 리턴한다.
  4. DispatcherServlet에 뷰 객체가 리턴되면 뷰 객체에 응답 결과 생성을 요청한 후 화면에 나타낸다.

MVC 처리 (상세 / 참고용으로만 작성중)

(1) 톰캣 서버 실행

  1. 웹어플리케이션이 실행되면 Tomcat(WAS) 에 의해 web.xml 파일이 로딩된다.
    • load-on-startup 으로 톰캣시작시 servlet 생성가능하도록 설정 가능함.
  2. web.xml이 등록되어있는 ContextLoaderListener(JAVA class)가 생성된다.
    • ContextLoaderListener 클래스는 ServletContextListener 인터페이스를 구현하고 있다.
    • 이 인터페이스는 최상위 컨텍스트인 ApplicationContext를 생성하는 역할을 수행한다.
    • 즉, ContextLoaderListener는 ApplicationContext를 생성한다.
  3. 생성된 ContextLoaderListener는 ApplicationContext.xml을 로딩한다. (최상위컨텍스트)
    • 첫번째 Spring Container 이다.
    • 근데 로딩을 하려면 설정파일 위치를 알려줘야한다. 안에 contextConfigLocation 이라고 해서 파라미터와 위치를 지정해 준다. (통상 root-context.xml)
  4. 생성된 ContextLoaderListener는 설정을 참조하여 root-context.xml 을 로딩한다. 그리고 root-context는 Context-param으로 선언되었기 때문에 WebApp 전역적으로 사용된다.
    • root-context.xml 을 말한다.
    • root-context 또는 application-context는 view와 관련되지 않은 객체를 정의한다.
    • 그러니까 결국은 Service, Repository 등 비지니스 로직 관련 bean을 설정하면 될것 같다.
    • root-context에 등록되는 빈들은 모든 컨텍스트에서 사용 할 수 있다. (공유가능)
    • Service, DAO를 포함한 웹환경에서 독립적인 Bean들을 담아둔다. (@Service, @Repository)
    • 서로 다른 servlet-context에서 공유해야 하는 빈들을 등록해놓고 사용할 수 있다.
    • servlet-context내 Bean들은 이용이 불가능하다.
  5. ApplicationContext.xml (root-context.xml) 에 등록되어있는 설정에 따라 Spring Container가 구동된다.
    • 이때 개발자가 작성한 비즈니스 로직에 대한 부분과 DAO, VO 객체들이 생성된다.
  6. 웹어플리케이션 LOAD 완료
    • 클라이언트로부터 웹어플리케이션 요청을 대기한다.

(2) 클라이언트로부터 요청이 왔을 때

  1. 사용자 요청이 오면 wab.xml 으로 먼저 전달된다.
  2. web.xml에 등록되어있는 DispatcherServlet (서블릿)이 생성된다.
    • DispatcherServlet은 FrontController의 역할을 수행한다.
    • 클라이언트로부터 요청은 메세지를 분석하여 알맞은 PageController에게 전달하고 PageController에게서 응답을 받아 요청에 따른 응답을 어떻게 할지 정한다.
    • 이러한 클래스들을 HandlerMapping, ViewResolver 클래스라고 한다.
  3. 생성된 DispatcherServlet는 spring-mvc.xml(서블릿)을 로딩한다.
    • 두번째 Spring Container 이다.
    • servlet-context.xml 을 말한다.
  4. 두번째 Spring Container가 (servlet-context.xml) 구동되면 응답에 맞는 PageController 들이 동작한다.
    • 이때 첫번째 Spring Container (root-context.xml)가 구동되면서 생성된 DAO, VO, ServiceImpl 클래스들과 협업하여 알맞은 작업을 처리하게된다.
    • HandlerMapping의 역할을 수행한다. 즉, url 패턴에 맞는 컨트롤러를 찾는다. 맞는 컨트롤러를 찾으면 view파일 이름을 return 한다.
    • ViewResolver 역할을 수행한다. 받아온 view파일 이름은 다시 두번째 Container(servlet-context.xml) 으로 돌아와서 프로젝트를 생성할때 만들어진 prefix와 suffix로 view파일 경로를 만들어준다.
    • 이렇게 만들어진 view파일을 가지고 jsp파일이 실행되면서 클라이언트에게 보여지게 된다.

Leave a comment