컨트롤러로
전달동적인 콘텐츠
를 생성, 클라이언트에게 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 패턴을 효율적으로 구현
할 수 있게 됨