
컨트롤러로 전달동적인 콘텐츠를 생성, 클라이언트에게 HTML, JSON 등의 형태로 응답을 전송하는 역할DispatcherServlet이 존재하기전에는 어떤 어려움이 있었고 DispatcherServlet이 어떤 이점을 가져다 주었는가?다수의 서블릿을 만들고 각각을 요청 URL에 직접 매핑해야 함LoginServlet, ProfileServlet, DashboardServlet 등 각각의 서블릿에서 사용자의 로그인 상태를 확인하는 비슷한 코드를 반복해서 작성해야 함DispatcherServlet이 도입되기 전, 일반적인 서블릿 기반의 웹 애플리케이션 개발 방식) 사용자 로그인, 사용자 정보 조회, 사용자 정보 업데이트를 해야하는 상황 각 기능을 처리하기 위해, 다음과 같이 세 개의 서블릿을 만들고 각각을 요청 URL에 매핑해야 함로그인 서블릿
LoginServlet/login사용자 정보 조회 서블릿
UserInfoServlet/user/info사용자 정보 업데이트 서블릿
- 서블릿 이름: UserUpdateServlet
- 매핑 URL: /user/update
하나: 공포의 web.xml(서블릿 3.0 이후에는 @WebServlet 사용으로 안해도 되긴함.)
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.example.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>UserInfoServlet</servlet-name>
<servlet-class>com.example.UserInfoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserInfoServlet</servlet-name>
<url-pattern>/user/info</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>UserUpdateServlet</servlet-name>
<servlet-class>com.example.UserUpdateServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserUpdateServlet</servlet-name>
<url-pattern>/user/update</url-pattern>
</servlet-mapping>
둘: 위에서 등록한 서블릿 매핑
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
// 로그인 처리 로직
}
@WebServlet("/user/info")
public class UserInfoServlet extends HttpServlet {
// 사용자 정보 조회 로직
}
@WebServlet("/user/update")
public class UserUpdateServlet extends HttpServlet {
// 사용자 정보 업데이트 로직
}
⇒ 각 기능마다 별도의 서블릿을 생성하고 관리해야함. 현재 컨트롤러딴에서 서비스 역할까지 다 때려박아야하는 일이 빈번..
단일 진입점 설정: 모든 요청은 DispatcherServlet을 통해 처리됨web.xml에 설정되거나, Spring Boot를 사용할 경우 자동으로 설정됨DispatcherServlet은 컨트롤러만을 호출함 사실상 이게 포인트DispatcherServlet은 핸들러 매핑을 통해 들어온 요청 URL을 처리할 컨트롤러를 찾음@Controller
public class UserController {
@RequestMapping(value = "/login", method = RequestMethod.GET)
public String login() {
// 로그인 페이지 반환
return "login";
}
@RequestMapping(value = "/user/info", method = RequestMethod.GET)
public ModelAndView userInfo() {
ModelAndView mav = new ModelAndView();
mav.addObject("userInfo", "사용자 정보");
mav.setViewName("userInfo");
return mav;
}
@RequestMapping(value = "/user/update", method = RequestMethod.POST)
public String updateUser(@ModelAttribute User user) {
// 사용자 정보 업데이트 로직
return "redirect:/user/info";
}
}DispatcherServlet 하나가 모든 요청을 받아 적절한 컨트롤러로 라우팅함중앙 집중화된 프론트 컨트롤러 역할을 하는 핵심 요소다른 컴포넌트로 라우팅하는 역할뷰를 선택하여 클라이언트에게 응답을 제공인터셉터, 뷰 리졸버 등과 같은 Spring MVC의 컴포넌트와 상호 작용MVC 패턴을 효율적으로 구현할 수 있게 됨