📌Dispatcher Servlet(디스패처 서블릿)
Dipatcher Servlet이란 서블릿 컨테이너의 가장 앞단에서 HTTP 프로토콜로 들어오는 모든 요청을 먼저 받아 적합한 컨트롤러에 위임해주는 프론트 컨트롤러입니다. 조금 더 자세히 설명하면 클라이언트로부터 어떠한 요청이 오면 Tomcat(톰캣)과 같은 서블릿 컨테이너가 요청을 받게됩니다. 그리고 이 모든 요청은 프론트 컨트롤러인 디스패처 서블릿이 가장 먼저 받게 됩니다. 그러면 디스패처 서블릿은 공통적인 작업을 먼저 처리한 후에 해당 요청을 처리하는 컨트롤러를 찾아 작업을 위임합니다.
디스패처 서블릿 등장하기 이전
디스패처 서블릿 등장하기 이후
디스패처 서블릿 역할
- HTTP 프로토콜로 들어오는 모든 요청을 먼저 받고, 요청을 적합한 컨트롤러에 위임해주는 역할을 수행합니다.
- 정적자원(Static Resources)의 처리를 수행합니다.
정적자원의 처리
Dispatcher Servlet이 모든 요청을 처리하다보니 이미지나 HTML / CSS / JavaScript 등과 같은 정적 파일에 대한 요청마저 모두 가로채는 까닭에 정적 자원을 불러오지 못하는 상황도 발생합니다. 이러한 문제를 해결하기 위해 2가지 방법이 존재합니다.
- 정적 자원 요청과 애플리케이션 요청을 분리
- 애플리케이션 요청을 탐색하고 없으면 정적 자원 요청으로 처리
정적 자원 요청과 애플리케이션 요청을 분리
- /apps 의 URL로 접근하면 Dispatcher Servlet이 담당합니다.
- /resources 의 URL로 접근하면 Dispatcher Servlet이 컨트롤할 수 없으므로 담당하지 않습니다.
이러한 방식은 코드가 지저분해지고, 모든 요청에 대해 URL을 위처럼 붙여야 하기 때문에 직관적인 설계를 할 수 없습니다. 따라서 두번째 방법으로 처리하게 되었습니다.
애플리케이션 요청을 탐색하고 없으면 정적 자원 요청으로 처리
Dispatcher Servlet이 요청을 처리할 컨트롤러를 먼저 찾고, 요청에 대한 컨트롤러를 찾을 수 없는 경우에, 2차적으로 설정된 자원(Resources) 경로를 탐색하여 자원을 탐색하는 방법입니다. 이렇게 영역을 분리하면 효율적인 리소스 관리를 지원할 뿐 아니라 추후 확장을 용이하게 해준다는 장점이 있습니다.
프론트 컨트롤러
프론트 컨트롤러는 서블릿 컨테이너 맨앞단에서 서버로 들어오는 클라이언트의 모든 요청을 받아 처리해주는 컨트롤러를 의미하며, MVC 구조에서 함께 사용되는 디자인 패턴입니다.
🔎 Dispatcher Servlet 동작 과정
- ① DispatcherServlet으로 클라이언트의 웹 요청(HttpServletRequest)이 들어옵니다.
- ② 웹 요청을 분석하여 handlerMapping에 위임하여 해당 요청을 처리할 Controller를 탐색합니다.
- ③ 찾은 Controller를 실행할 수 있는 HandlerAdapter를 탐색합니다.
- ④, ⑤ 찾은 HandlerAdapter(Controller를 실행할 수 있는 처리기) 를 사용하여 Controller를 실행합니다.
- 비즈니스 로직을 수행 후 Model(data)과 View를 반환받습니다.
- ⑥ View 이름을 ViewResolver에게 전달하고, ViewResolver는 해당하는 View 객체를 반환합니다.
- ⑦ DispatcherServlet은 View에게 Model을 전달하고 화면 표시를 요청합니다. 이때 Model이 null이면 View를 그대로 사용합니다. 반면 값이 있으면 View에 Model 데이터를 렌더링합니다.
- ⑧ 최종적으로 DispatcherServlet은 View 결과(HttpServletResponse)를 클라이언트에게 반환합니다.
❓여러 요청이 들어올때, DispatcherServlet은 한번에 여러 요청을 모두 받을 수 있을까?
DispatcherServlet은 여러 요청을 동시에 처리할 수 있습니다. 웹 서버에서 동작하는 서블릿 컨테이너는 일반적으로 멀티스레딩 환경에서 작동하므로, 여러 클라이언트로부터 동시에 들어오는 요청들을 각각의 스레드에서 독립적으로 처리할 수 있습니다.
'CS > Java' 카테고리의 다른 글
[Java] HashMap, HashTable, ConcurrentHashMap, CopyOnWriteArrayList, SynchronizedList 비교 (0) | 2024.05.11 |
---|---|
[Java] JPA를 사용하는 이유, ORM이란?, JPA와 MyBatis의 차이 (0) | 2024.05.09 |
[Java] equals(), hashCode() (0) | 2024.05.05 |
[Java] Error와 Exception (0) | 2024.05.02 |
[Java] static 이란 ? (0) | 2024.04.29 |