[Study-NextStep] 2022-01-31

jeonye·2022년 1월 30일
0

Study

목록 보기
7/8

일시 : 2022-01-31
범위 : 자바 웹 프로그래밍 Next Step 9장 실습(p305-p306)
목적 : 지금까지 학습한 내용을 최종 점검

Traning

문제1

Tomcat 서버를 시작할 때 웹 애플리케이션이 초기화하는 과정을 설명하라.

내가 생각한 답

  1. WebServerLauncher 클래스를 실행시켜 톰캣 서버를 시작한다. WebServerLauncher 클래스에서는 웹 자원(HTML, CSS, 자바스크립트)이 위치하는 디렉토리와 이 디렉토리 자원을 접근할 때의 경로(해당 소스에서는 /로 설정하고 있음)를 설정하고 있다.
  2. 웹 애플리케이션이 실행되면 ServletContextListener 인터페이스를 구현하는 ContextLoaderListener 클래스가 생성된다. ContextLoaderListener 클래스에서는 데이터베이스를 설정하고 있다.
  3. 생성된 ContextLoaderListener가 ApplicationContext를 로딩한다. ApplicationContext를 로딩하기 위해 클래스패스에 있는 Servlet 인터페이스를 구현하는 서블릿 클래스를 찾는다.
    HttpServlet을 상속하는 클래스를 찾은 후, @WebServlet 애노테이션의 값을 읽어 요청 URL과 서블릿을 연결하는 Map을 생성한다.
    즉, RequestMapping의 Map에 서블릿을 추가하고, 요청 URL에 대한 서블릿을 찾아 서비스하는 역할을 서블릿 컨테이너가 담당한다.
  4. 서블릿은 생성과정에서 init() 메서드가 실행된다. 사용자의 요청 여부에 관계없이 서블릿 컨테이너(톰캣)가 시작됨과 동시에 서블릿의 생성과 초기화를 진행하고 싶을 경우, loadOnStartUp 속성값으로 0이상의 정수를 설정하면 된다.
    즉, 톰캣이 실행되면서 'loadOnStartup = 1'이 설정되어 있는 DispatcherServlet 클래스의 init 메소드를 호출해 초기화를 진행한다.
  5. DispatcherServlet 클래스의 init()에 있는 'rm(RequestMapping).initMapping()' 구문에 따라 요청 URI와 컨트롤러를 연결하는 Map을 생성한다.

초기화 작업이 완료되면 이후부터는 사용자 요청에 따라 service()가 실행된다.

책에 기재된 답

(생각하지 못한 곳은 강조 표시)

  1. 서블릿 컨테이너는 웹 애플리케이션의 상태를 관리하는 ServletContext를 생성한다.
  2. ServletContext가 초기화되면 컨텍스트의 초기화 이벤트가 발생한다.
  3. 등록된 ServletContextListener의 콜백 메소드가 호출된다.
    이 문제에서는 ContextLoaderListener의 contextInitialized() 메소드가 호출된다.
  4. jwp.sql 파일에서 SQL문을 실행해 데이터베이스 테이블을 초기화한다.
  5. 서블릿 컨테이너는 클라이언트로부터의 최초 요청시(또는 컨테이너에 서블릿 인스턴스를 생성하도록 미리 설정을 한다면 최초 요청 전에) DispatcherServlet 인스턴스를 생성한다(생성자 호출).
    이에 대한 설정은 @WebServlet의 loadOnStartup 속성으로 설정할 수 있다. 이 문제에서는 loadOnStartup 속성이 설정되어 있기 때문에 서블릿 컨테이너가 시작하는 시점에 인스턴스를 생성한다.
  6. DispatcherSevlet 인스턴스의 init() 메소드를 호출해 초기화 작업을 진행한다.
  7. init() 메소드 안에서 RequestMapping 객체를 생성한다.
  8. RequestMapping 인스턴스의 initMapping() 메소드를 호출한다. initMapping() 메소드에서는 요청 URL과 Controller 인스턴스를 매핑시킨다.

문제2

Tomcat 서버를 시작한 후 http://localhost:8080으로 접근시 호출 순서 및 흐름을 설명하라.

내가 생각한 답

  1. @WebServlet의 urlPattern이 '/'인 DispatcherServlet의 service() 메소드가 호출된다.
  2. 요청 URI를 파라미터로 RequestMapping 클래스의 findController 메소드를 호출하여 요청 URI('/')와 연결된 컨트롤러(HomeController)를 생성한다.
    참고로 URI와 컨트롤러의 연결 작업은 웹 애플리케이션 초기화 과정에서 이루어진다.
  3. 조회한 컨트롤러(HomeController)의 execute() 메소드를 호출하여 데이터(질문 목록)과 이동 파일명(home.jsp)이 설정된 View(JspView) 객체를 생성한다.
  4. 데이터를 파라미터로 View 클래스의 render() 메소드를 호출하여 HttpServletRequest에 데이터를 설정한 뒤, 이동 파일명(home.jsp)으로 이동(Forward)한다.
  5. HttpServletRequest에 설정한 데이터(질문 목록)가 home.jsp에 바인딩되어 화면에 출력된다.

책에 기재된 답

(생각하지 못한 곳은 강조 표시)

  1. localhost:8080으로 접근하면 요청을 처리할 서블릿에 접근하기 전에 먼저 ResourceFilter와 CharacterEncodingFilter의 doFilter() 메소드가 실행된다.
    ResourceFilter의 경우 해당 요청이 정적 자원(CSS, 자바스크립트, 이미지) 요청이 아니기 때문에 서블릿으로 요청을 위임한다.
  2. 요청 처리는 "/"으로 매핑되어 있는 DispatcherServlet이므로 이 서블릿의 service() 메소드가 실행된다.
  3. servlet() 메소드는 요청받은 URL을 분석해 해당 Controller 객체를 RequestMapping에서 가져온다. 요청 URL은 "/"이며, 이와 연결되어 있는 HomeController가 반환된다.
  4. service() 메소드는 HomeController의 execute() 메소드에게 작업을 위임한다.
    요청에 대한 실질적인 작업은 HomeController의 execute() 메소드가 실행한다. execute() 메소드의 반환 값은 ModelAndView이다.
  5. service() 메소드는 반환 받은 ModelAndView의 모델 데이터를 뷰의 render() 메소드에 전달한다. 이 요청에서 View는 JspView이다.
    JspView는 render() 메소드로 전달된 모델 데이터를 home.jsp에 전달해 HTML을 생성하고, 응답함으로써 작업을 끝낸다.

Realize

Servlet Container

서블릿 컨테이너의 중요한 역할 중의 하나는 서블릿 클래스의 인스턴스 생성, 요청 URL과 서블릿 인스턴스 매핑, 클라이언트 요청에 해당하는 서블릿을 찾은 후 서블릿에 작업을 위임하는 역할을 한다. 이외에도 서블릿 컨테이너는 서블릿과 관련한 초기화(init)와 소멸(destroy) 작업도 담당한다.

0개의 댓글