스프링 프로젝트 MVC 처리과정
개요
: 스프링 프로젝트의 MVC 처리과정에 대해서 알아본다.
- 프로젝트:
Spring Legacy Project
- 템플릿:
Spring MVC Project
구조
: 아래는 스프링 MVC 패턴에서 전체적으로 처리되든 일련의 과정이다.
상세
요약
MVC 처리
(1) 톰캣 서버 실행
- WAS가 구동되면 web.xml를 로딩한다.
- 로딩된 web.xml에서 ContextLoaderListener 클래스를 생성한다. (스프링 설정을 읽기위한 프레임웍동작의 기본이다.)
- 이때 리스너가 동작하기 위해 설정파일 위치를 알려줘야한다.
안에 contextConfigLocation이라고 해서 파라미터와 위치를 지정해 준다. (통상 root-context.xml) - 생성된 ContextLoaderListener는 설정을 참조하여 root-context.xml 을 로딩한다. 그리고 root-context는 Context-param으로 선언되었기 때문에 WebApp 전역적으로 사용된다.
- 로딩된 root-context에 등록된 Spring 컨테이너가 구동되며 Service, dao, impl 등의 객체도 함께 생성된다.
(2) 클라이언트로부터 요청이 왔을 때
- url 패턴으로 들어온 요청을 DispatcherServlet 이 가로챈다.
- DispatcherServlet JAVA 클래스가 생성된다. (다른말로 스프링컨테이너 Spring Container 라고한다)
- DispatcherServlet 생성은
태그에 등록된 servlet-context.xml 을 기준으로 로딩된다. - DispatcherServlet 생성은 이전에 전역으로 로딩한 root-context.xml 과 함께 협업하여 로딩한다.
- servlet-context.xml(Spring Container) 가 구동되며 Controller 들을
태그 같은 기능으로 Controller 클래스를 bean 객체로 만든다. 즉, 컨테이너(Container)에 bean으로 등록한다.
(3) 클라이언트 요청 처리
- HandlerMapping 를 수행하여 아까 만들어진 Controller 빈(bean) 객체 중 요청url 주소와 맞는 컨트롤러를 찾는다.
- 위 작업으로 컨트롤러를 찾았다면 HandlerAdapter 를 수행하고 컨트롤러를 연결하여 동작(실행) 한다. Ex) Controller ==> Service ==> DAO
- DispatcherServlet이 ModelAndView 객체를 받으면 ViewResolver 객체가 화면에 표시할 뷰 객체를 찾아 DispatcherServlet에 리턴한다.
- DispatcherServlet에 뷰 객체가 리턴되면 뷰 객체에 응답 결과 생성을 요청한 후 화면에 나타낸다.
MVC 처리 (상세 / 참고용으로만 작성중)
(1) 톰캣 서버 실행
- 웹어플리케이션이 실행되면 Tomcat(WAS) 에 의해 web.xml 파일이 로딩된다.
- load-on-startup 으로 톰캣시작시 servlet 생성가능하도록 설정 가능함.
- web.xml이 등록되어있는 ContextLoaderListener(JAVA class)가 생성된다.
- ContextLoaderListener 클래스는 ServletContextListener 인터페이스를 구현하고 있다.
- 이 인터페이스는 최상위 컨텍스트인 ApplicationContext를 생성하는 역할을 수행한다.
- 즉, ContextLoaderListener는 ApplicationContext를 생성한다.
- 생성된 ContextLoaderListener는 ApplicationContext.xml을 로딩한다. (최상위컨텍스트)
- 첫번째 Spring Container 이다.
- 근데 로딩을 하려면 설정파일 위치를 알려줘야한다.
안에 contextConfigLocation 이라고 해서 파라미터와 위치를 지정해 준다. (통상 root-context.xml)
- 생성된 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들은 이용이 불가능하다.
- ApplicationContext.xml (root-context.xml) 에 등록되어있는 설정에 따라 Spring Container가 구동된다.
- 이때 개발자가 작성한 비즈니스 로직에 대한 부분과 DAO, VO 객체들이 생성된다.
- 웹어플리케이션 LOAD 완료
- 클라이언트로부터 웹어플리케이션 요청을 대기한다.
(2) 클라이언트로부터 요청이 왔을 때
- 사용자 요청이 오면 wab.xml 으로 먼저 전달된다.
- web.xml에 등록되어있는 DispatcherServlet (서블릿)이 생성된다.
- DispatcherServlet은 FrontController의 역할을 수행한다.
- 클라이언트로부터 요청은 메세지를 분석하여 알맞은 PageController에게 전달하고 PageController에게서 응답을 받아 요청에 따른 응답을 어떻게 할지 정한다.
- 이러한 클래스들을 HandlerMapping, ViewResolver 클래스라고 한다.
- 생성된 DispatcherServlet는 spring-mvc.xml(서블릿)을 로딩한다.
- 두번째 Spring Container 이다.
- servlet-context.xml 을 말한다.
- 두번째 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