Chapter 9


  • WebServer의 초기화 과정
  • 소스코드의 호출 순서 및 흐름
  • 한글이 깨지는 현상을 ServletFilter로 해결
  • @WebServlet loadOnStartUp과 URL 매핑
    • loadOnStartUp이 의미하는것?
    • URL매핑중 “/”와 “/*“의 차이
  • 서블릿을 잘못 구현한 경우 (동시성 문제)
    • 책에서 추천해준 영상 보기
  • 조합이란? (composition)
  • ModelAndView에서 render 메서드의 역할은?

알아본 것


  • WebServer의 초기화 과정
    • 서블릿 컨테이너(톰캣)이 실행되면서 등록된 이벤트 리스너에 정의된 ServletContextListener의 contextInitialized() 메서드를 호출한다.
    • DispatcherServlet 인스턴스를 생성한다. (생성자 호출)
    • @WebServlet 어노테이션에 loadOnStartup 속성에 의해 DispatcherServlet 인스턴스를 생성한다.
      • 0 또는 음수 : 실제 요청이 들어왔을 때 인스턴스를 생성한다.
      • 양수 : 초기화 과정에서 인스턴스를 생성한다. (숫자가 작은 인스턴스부터 생성 ex) 1 -> 2 )
      • 미지정 : 0으로 설정한 것과 같음
    • DispatcherServlet 인스턴스가 생성되면 해당 인스턴스의 init() 메서드가 호출된다.
    • init() 메서드에서 RequestMapping 객체를 생성한다
    • RequestMapping 인스턴스의 initMapping() 메서드가 호출된다.
      • 각 요청 url별로 Controller 인스턴스를 매핑한다.
  • Filter는 doFilter를 실행하여 필터를 적용한다
    • ResourceFilter : 정적 자원 요청인 경우 서블릿에 위임하지 않고 바로 자원을 제공한다.
      • url 패턴 : “/”와 “/*“의 차이
        • ”/” : 디폴트 서블릿으로 서블릿 매핑 URL에 걸러지지 않은 URL에 대한 패턴이다.
        • ”/*” : 모든 URL에 대한 패턴으로 서블릿 매핑 URL에 걸러졌더라도 적용된다.
    • CharacterEncodingFilter
      • HttpServletRequest에 인코딩 설정이 안되어 있으면 기본 인코딩 설정을 한다.
      • 강제 설정이 setup 된 경우 Request와 Response 인코딩을 강제로 설정해준다.
  • ModelAndView에서 render 메서드의 역할

    • Controller에서 역할에 맞는 View를 리턴

      • JsonView 혹은 JspView (두 View객체는 ModelAndView를 상속)
      • ModelAndView (추상 클래스 혹은 Interface)는 render 메서드를 구현
    • DispatcherServlet에서 Controller의 리턴을 받아 render 메서드를 호출해준다.

    • 해당 View가 render됨

    자세한 내용은 8장 View 부분을 참고하기 바람

    예제코드)

    // ModelAndView
    public interface ModelAndView {
      public void render(); // render 메서드 정의
    }
    
    // JspView
    public class JsonView implements ModelAndView {
      public void render() {
        //... render 메서드 구현
      }
    }
    
    // Controller
    public class TestController {
      public ModelAndView execute() {
        // ...
        return new JspView(Model model); // JspView를 리턴
      }
    }
    
    // DispatcherServlet
    public void service() {
      // ...
      Controller controller = dispathcerMap.get(url);
      ModelAndView view = controller.execute();
      view.render(); // controller에서 리턴한 ModelAndView의 render 메서드 호출
    }
    
  • 상속 vs 조합 (Inheritance VS Composition)
    • 참고 : https://wikidocs.net/894
    • 상속
      • 부모 클래스를 자식 클래스가 그대로 상속 받는다.
      • 장점 : 컴파일 시점에 정적으로 정의되기 때문에 이해하기 쉽다.
      • 단점 : 컴파일 시점에 정의되기 때문에 유연성이 떨어진다.
    • 조합
      • 다른 여러개의 객체를 포함해 새로운 기능 혹은 객체를 구성하는 것
      • 장점
        • 동적으로 정의되기 때문에 유연하게 동작함
        • 완벽한 재사용성
      • 단점 : 동적으로 정의되기 때문에 코드 이해가 어려움
  • 서블릿을 잘못 구현한 경우 동시성 문제
    • 관련 영상 : https://youtu.be/9lQsAPFQjBg