///////
Search
🥗

Dispatcher Servlet이란 무엇인가요?

Front Controller

서블릿 컨테이너 제일 앞단에서 서버로 오는 모든 요청을 받아 처리하는 컨트롤러
기존의 servlet
요청 url당 servlet을 생성하고 해당 controller 에게 요청을 보내는 코드를 따로 작성해야 했다
Front Controller 패턴
하나의 servlet에서 요청을 받아들여 적절한 controller로 요청을 위임한다
사용자의 요청에 대해 인코딩 처리, 에러페이지 처리, 공지 등에 대한 처리도 한 곳에서 처리할 수 있다

Dispatcher Servlet의 흐름

디스패처 서블릿은 공통적인 작업을 먼저 처리한 후에 해당 요청을 처리해야 하는 컨트롤러를 찾아서 작업을 위임합니다.
1.
요청 접수 web.xml에 설정된 url-pattern에 해당하는 경우 http request를 받는다
2.
컨트롤러로 요청 위임 url, method 같은 요청 정보를 참고해서 컨트롤러에게 작업을 위임
3.
컨트롤러에서 작업 진행
요청이 위임된 컨트롤러에서 작업을 진행
작업이 끝나면 다시 dispatcher servelt으로 결과를 반환
4.
뷰 호출
dispatcher servelt은 뷰에게 모델을 넘겨주며 최종 결과물을 생성
5.
최종 읍답
dispatcher servelt은 공통으로 진행해야 할 후처리 작업이 있는 지 확인 후 수행
수행 후 HttpServeltResponse에 있는 최종 결과를 서블릿 컨테이너에게 돌려주고 컨테이너는 클라이언트에 전송하여 응답

Dispatcher Servlet의 장점

url마다 Servlet을 매핑하지 않아도 된다
모든 Request에 대해 1:1로 Servlet을 생성해주게 되면, 매핑 정보를 모두 기록해야 하는 web.xml 파일이 너무 복잡하고 커진다
주소마다 servlet이 있는 것이 아니라 하나의 servlet이 모든 request를 관리하기 때문에 공통적인 전처리, 후처리 작업을 할 수 있다

Dispatcher Servlet의 단점 보안

Dispatcher Servlet이 모든 요청을 처리하다보니 이미지나 HTML 등과 같은 정적 리소스에 대한 요청까지도 모두 가로채 정적 리소스를 불러오지 못하는 상황도 발생하곤 했다
두 가지 방안
1. 정적 리소스에 대한 요청과 어플리케이션에 대한 요청 분리
클라이언트의 요청을 두 타입으로 분리하는 것이다
/apps 의 URL 로 접근할 경우 디스패처 서블릿이 처리를 담당
/resources 의 URL 로 접근할 경우 디스패처 서블릿이 컨트롤할 수 없는 요청이므로 담당하지 않음
이러한 방식은, 앞서 언급한 문제는 해결할 수 있지만 소스 코드가 상당히 지저분해지며 모든 요청에 대해 /apps 나 /resources URL 을 붙여야 하므로 직관적인 설계가 될 수 없다.
2. 어플리케이션에 대한 요청을 탐색하고, 없을 경우 정적 리소스에 대한 요청으로 처리
모든 요청에 대해 디스패처 서블릿이 적합한 컨트롤러를 탐색하고, 해당 요청에 대한 컨트롤러를 찾을 수 없는 경우2차적으로 설정된 정적 리소스 경로를 탐색해 리소스를 찾는 방식
이렇게 영역을 분리하면 효율적인 리소스 관리가 가능할 뿐 아니라 추후에 확장이 용이하다는 장점을 가지게 된다