본문 바로가기

Dev.BackEnd/Servlet&JSP

#미니 MVC FrameWork 작동원리 정리


First, 웹 애플리케이션의 실행

WAS가 실행되면 서블릿 컨테이너( Tomcat )가 '메소드' 를 호출한다.

이 메소드는 ContextLoaderListener.java 에 있는 contextInitialized(event) 메소드이다.

실행이라는 event를 인자로 받아 실행되는 것이다.

ContextLoaderListener 클래스는 ServletContextListener라는 인터페이스를 구현하고 있다.

WAS의 실행을 Listen하고 있는 것이다.


contextInitialized(event) 메소드의 역할

이 메소드는 ServletContext 저장소에서 propertiespath를 꺼내온다.

그리고 이 propertiespath를 이용하여 ApplicationContext 클래스를 생성한다.

이 ApplicationContext 클래스는 서비스를 위한 객체들을 준비하는 역할을 한다.


ApplicationContext의 역할

ContextLoaderListener에 의해 생성되는 순간 5가지 작업을 수행하게 된다.

1. 전달받은 propertiespath를 통해 프로젝트 폴더에 저장되어 있는 properties파일을 로딩한다.

2. prepareObject 메소드를 통해 Tomcat Server로부터 DataSource를 받아온다.

3. prepareAnnotationObjects 메소드를 통해 DAO와 Page Controller 객체들을 생성한다.

4. 2번, 3번에서 받아오고 생성한 것들을 HashTable이라는 자료구조에 저장한다.

5. injectDependency 메소드를 통해 DAO에는 DataSource를 주입하고, Page Controller에는 DAO를 주입한다.


이렇게 하면 브라우저로부터 요청받을 준비가 끝나게 된다.









Second, Request 의 처리 1단계

브라우저로부터 들어오는 모든 요청들은 프런트 컨트롤러( Front Contoller )에 도달하게 된다.

프런트 컨트롤러는 HttpServlet을 상속받고 있는 '서블릿'이다.


DispatcherServlet ( Front Controller )의 역할

1. 프런트 컨트롤러는 ContextLoaderListener로부터 ApplicationContext를 get 한다.

2. 브라우저의 요청에 대한 ServletPath를 ServletContext로부터 추출하여 Page Contoller를 get하게 된다.

3. prepareRequestData 메소드를 통해 Page Controller로부터 요청에 필요한 Data를 파악하고 준비하게 된다.

4. Page Controller와 Data를 주고받을 객체 ( model ) 를 생성한다. ( HashMap이라는 자료구조를 사용 )

5. model 객체를 통해 Page Controller에 Data를 전달하고 요청에 따른 작업을 위임한다.


ServletRequestDataBinder 클래스의 역할

prepareRequestData 메소드를 수행하는 과정 중에,

파악된 DataName과 DataType을 알맞게 생성하는 .bind라는 메소드가 있다.

이 bind 메소드를 이 클래스에서 구현한다.

1. 필요한 데이터 타입이 Primitive Type의 데이터인 경우에는 그에 맞는 객체를 바로 생성한다.

2. Member 객체를 생성하고, findSetter 메소드를 통해, 주입해줘야 할 메소드를 찾는다.

3. method.invoke를 이용하여, 역으로 접근하여 set 메소드를 실행시켜 필요한 Data를 준비한다.




Third, Request 의 처리 2단계

프런트 컨트롤러로부터 페이지 컨트롤러로 요청이 넘어오게 된다.

페이지 컨트롤러는 들어온 요청으 get 요청인지, post 요청인지 파악한 후에,

DAO와 협력한 후, 요청에 맞는 URL을 다시 프런트 컨트롤러로 전달한다.


Page Controller 의 역할

1. 전달받은 model 객체에서 Data를 꺼내 get 요청인지, post 요청인지 파악한다.

2. 페이지 컨트롤러는 ApplicationContext 클래스에서 DAO를 주입받았다. 

   post 요청이라면 DAO를 통해, Data를 수정하거나, 삭제하거나, 조회하는 등 작업을 수행한다.

3. 요청에 따른 JSP 파일을 URL을 통해, 프런트 컨트롤러에게 전달한다.


다시, DispatcherServlet ( Front Controller )의 역할

1. 페이지 컨트롤러로부터 전달받은 URL을 통해, 브라우저에 전송할 페이지를 생성한다.

2. 위임방식을 결정하여 include로 또는 forward로 전송한다.



The End