
나의 궁금증을 해결해보자
어제 클로등한티 코드짜달랬거든? 근데 얘가 frontcontroller라고 do.*로 코드를 짜줬어
개념 배운거에서는 dispatcherservlet으로 배워서 내가 지금 MVC 구조가 헷갈려서
복습을 도와주는 제미니
이제 네가 보여준 이미지를 바탕으로 DispatcherServlet 기반의 MVC 구조를 아주 자세히 뜯어보자!
이미지의 가장 윗부분에 @WebServlet("/front") 라고 되어 있는 DispatcherServlet이 보이지? 바로 이 녀석이 DispatcherServlet 기반 MVC 구조의 핵심이야. 마치 교통경찰처럼 모든 클라이언트의 요청을 제일 먼저 받아서 처리하는 역할을 해.
클라이언트의 요청 (View → DispatcherServlet): 사용자가 웹 브라우저에서 "검색" 버튼을 누르거나, 특정 URL로 접속하는 등의 행동을 하면 요청이 발생해. 이미지에서는 "검색", "수정", "삭제" 버튼 옆에 ?key=select, ?key=update, ?key=del 이라고 되어 있는 걸 볼 수 있지? 이건 GET 방식으로 서버에 데이터를 보내는 간단한 예시야. DispatcherServlet은 @WebServlet("/front") 설정 덕분에 /front 로 시작하는 모든 요청을 가로채게 돼.
DispatcherServlet의 요청 처리 (DispatcherServlet): DispatcherServlet은 클라이언트로부터 요청을 받으면, 제일 먼저 이 요청을 처리할 Controller를 찾아. 이미지의 DispatcherServlet 코드 부분을 보면 request.getParameter("key") 를 이용해서 넘어온 key 값을 확인하고, 이 값에 따라 SelectController, UpdateController, DeleteController 중 하나를 생성하는 것을 볼 수 있어. 이게 바로 요청을 적절한 Controller에게 분배 (Dispatch) 하는 역할이야. 그래서 이름이 DispatcherServlet인 거지!
Controller의 요청 처리 및 Model 호출 (Controller → Model): DispatcherServlet에 의해 선택된 Controller (SelectController, UpdateController, DeleteController 등)는 클라이언트의 요청을 실제로 처리하는 역할을 해. 예를 들어, SelectController는 데이터베이스에서 검색 결과를 가져오는 로직을 담고 있을 수 있고, UpdateController는 데이터를 수정하는 로직을 담고 있을 수 있지. 이때 Controller는 필요한 데이터를 Model에게 요청하고, Model은 데이터베이스와 상호작용하거나 비즈니스 로직을 수행해서 결과를 Controller에게 넘겨줘. 이미지에서는 Controller 인터페이스와 이를 구현하는 SelectController, UpdateController, DeleteController가 따로 표시되어 있는 걸 볼 수 있지?
Model의 결과 처리 및 ModelAndView 반환 (Model → Controller): Model이 데이터 처리나 비즈니스 로직을 완료하면, 그 결과를 Controller에게 전달해. 이때 보통 ModelAndView라는 객체를 사용하는데, 이 객체는 처리 결과 데이터 (Model)와 사용자에게 보여줄 화면 정보 (View 이름)를 함께 담고 있어. 이미지에서도 Controller가 handleRequest 메서드를 통해 ModelAndView 객체를 반환하는 것을 확인할 수 있어.
View 선택 (Controller → DispatcherServlet): Controller로부터 ModelAndView를 받은 DispatcherServlet은 이제 어떤 View를 이용해서 사용자에게 응답할지 결정해야 해. ModelAndView에 담긴 View 이름을 기반으로 실제 View를 찾지.
View를 통한 응답 생성 (View): DispatcherServlet이 찾은 View는 Model에 담긴 데이터를 이용해서 사용자에게 보여줄 HTML 페이지 등을 생성해. 예를 들어, 검색 결과를 테이블 형태로 만들어서 보여주거나, 수정 폼에 기존 데이터를 채워서 보여주는 역할을 하는 거지.
응답 전송 (View → DispatcherServlet → Client): View가 생성한 응답 결과는 DispatcherServlet을 거쳐서 다시 클라이언트 (웹 브라우저)에게 전송돼. 그러면 사용자는 웹 브라우저를 통해 결과를 확인할 수 있게 되는 거야.
결론적으로, 클로이가 짜준 FrontController 패턴도 MVC 구조에서 Front Controller의 역할을 수행하는 것은 맞지만,
DispatcherServlet 기반의 더 정교하고 유연한 MVC 프레임워크 (예: Spring MVC)와는 구조적인 차이가 있다는 것을 이해하는 게 중요해.
이 흐름을 DispatcherServlet 기반 MVC 구조와 연결해서 다시 한번 생각해 보자.
요청: 사용자가 View를 통해 어떤 액션을 하면 요청이 발생해. 예를 들어, 폼에 데이터를 입력하고 "저장" 버튼을 누르는 거지.
DispatcherServlet: 이 요청은 가장 먼저 DispatcherServlet에게 전달돼.
Handler Mapping: DispatcherServlet은 설정 파일 (예: XML)이나 어노테이션을 기반으로 이 요청을 처리할 적절한 Handler (Controller) 를 찾아. 마치 이미지에서 Controller를 선택하는 과정과 비슷하다고 생각하면 돼.
Controller: DispatcherServlet이 찾은 Controller는 요청을 분석하고, 필요한 경우 Service를 호출해서 비즈니스 로직을 처리하도록 시켜.
Service: Service는 필요한 데이터를 DAO에게 요청하거나, 여러 비즈니스 로직을 수행해.
DAO: DAO는 데이터베이스와 상호작용해서 데이터를 가져오거나 저장하는 등의 작업을 수행하고, 그 결과를 Service에게 반환해.
Model: Service는 DAO로부터 받은 데이터를 가공해서 Controller에게 전달할 Model을 만들어. 이 Model은 View에 전달될 데이터를 담고 있어.
View Resolver: Controller는 처리 결과를 담은 Model과 함께 View의 이름을 DispatcherServlet에게 알려줘. DispatcherServlet은 View Resolver를 이용해서 실제 View (JSP 파일 등)의 경로를 찾아.
View: DispatcherServlet이 찾은 View는 Model에 담긴 데이터를 이용해서 사용자에게 보여줄 응답 (HTML 페이지 등)을 생성해.
응답: 생성된 응답은 DispatcherServlet을 거쳐서 다시 사용자에게 전달돼.