AbstractController
상속 구조
하는 일
모든 컨트롤러들의 기본이 되는 클래스로써 위 그림에 표시되어 있는 일들을 합니다.
여기서 한 가지 주목할 것은 Controller 인터페이스를 구현함에 따라 구현해야할 handleRequest 입니다.
이 메소드는 final로 다음과 같이 구현되어 있습니다.
throws Exception {
// Delegate to WebContentGenerator for checking and preparing.
checkAndPrepare(request, response, this instanceof LastModified);
// Execute handleRequestInternal in synchronized block if required.
if (this.synchronizeOnSession) {
HttpSession session = request.getSession(false);
if (session != null) {
Object mutex = WebUtils.getSessionMutex(session);
synchronized (mutex) {
return handleRequestInternal(request, response);
}
}
}
return handleRequestInternal(request, response);
}
이 메소드와 관련된 자세한 설명은 KSUG 제 2회 세미나에서 영회형이 설명해주셨지만 Spring MVC 118쪽에도 적혀있습니다. 워크 플로우와 메소드들의 라이프 사이클을 지키면서도 상속 받아 사용하는 녀석들에 때라 행동을 다르게 정의 할 수 있도록 Open-Closed Principle 을 구현한 사례에 해당합니다.
Workflow
1. DispatcherServelet에 의해 handleRequest() 호출됨.
2. 지원하는 요청의 타입을 조사(만약 지원하는 요청이 아닐 경우 ServletException 발생)
3. 세션이 필오하면 가져오려고 시도함.(없을 경우 ServletException 발생)
4. cacheSeconds 속성에 따라 필요하다면 캐슁 헤더를 설정함.
5. handleRequestInternal() 추상 메소드를 호출(이때 설정에 따라 HttpSession을 동기화 함)