Controller 분리
기존
- DispatcherServlet클래스로 Controller를 모두 구현했다
- 클라이언트의 모든 요청을 하나의 서블릿이 처리한다
- 개발과 유지보수가 어렵다
해결
- Sping MVC와 동일한 구조의 프레임워크를 직접 구현하여 적용해본다
- 중요 => DispatcherServlet클래스는 새로운 기능이 추가되도 변경되지 않는다
구조
- DispatcherServlet : Client로부터 요청을 받는다
- HandlerMappling : 요청path와 일치하는 Controller객체를 반환한다
- Controller : 반환된 객체에서 실질적인 사용자 요청 메소드를 실행한다
- String : Controller 실행결과로 받은 이동파일 이름
- ViewResolver : 이동파일 경로 + 파일 이름을 반환한다
- View : 이동할 파일로 이동한다
코드
DispatcherServlet
public class DispatcherServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private HandlerMapping handlerMapping;
private ViewResolver viewResolver;
// 스블릿 실행시 초기에 무조건 실행됨
public void init() throws ServletException{
// 어떤 컨트롤러를 가져올지 정함
handlerMapping = new HandlerMapping();
// 컨트롤러 실행 후 경로 지정
viewResolver = new ViewResolver();
viewResolver.setPrefix("./");
viewResolver.setSuffix(".jsp");
}
...
private void process(HttpServletRequest request, HttpServletResponse response) throws IOException{
// 1. 클라이언트의 요청 path 정보를 추출한다.
String uri = request.getRequestURI();
String path = uri.substring(uri.lastIndexOf("/"));
// 2. HandlerMappling을 통해 path에 해당하는 Controller반환
Controller ctrl = handlerMapping.getController(path);
// 3. 검색된 Controller실행 후에 결과 파일 반환
String viewName = ctrl.handleRequest(request, response);
// 4. ViewResolver를 통해 viewName에 해당하는 화면을 검색한다.
String view = null;
if(!viewName.contai ns(".do")) {
view = viewResolver.getView(viewName);
} else {
view = viewName;
}
// 5. 해당화면으로 이동
response.sendRedirect(viewName);
}
}
HandlerMapping
public class HandlerMapping {
private Map<String, Controller> mappings;
public HandlerMapping() {
mappings = new HashMap<String,Controller>();
mappings.put("login.do", new LoginController());
mappings.put("logout.do", new LogoutController());
mappings.put("insertBoard.do", new InsertBoardController());
mappings.put("updateBoard.do", new UpdateBoardController());
mappings.put("deleteBoard.do", new DeleteBoardController());
mappings.put("getBoard.do", new GetBoardController());
mappings.put("getBoardList.do", new GetBoardListController());
}
public Controller getController(String path) {
return mappings.get(path);
}
}
LoginController
public class LoginController implements Controller{
@Override
public String handleRequest(HttpServletRequest request, HttpServletResponse response) {
System.out.println("login처리");
// 1. 사용자 입력 정보 추출
String id = request.getParameter("id");
String password = request.getParameter("password");
// 2. DB연동 처리
UserVO vo = new UserVO();
vo.setId(id);
vo.setPassword(password);
UserDAO userdao = new UserDAO();
UserVO user = userdao.getUser(vo);
// 3. 화면네비게이션
if(user != null){
return "getBoardList.do";
}else {
return "login";
}
}
}
ViewResolver
public class ViewResolver {
public String prefix;
public String suffix;
public void setPrefix(String prefix) {
this.prefix = prefix;
}
public void setSuffix(String suffix) {
this.suffix = suffix;
}
public String getView(String viewName) {
return prefix + viewName + suffix;
}
}
Spring MVC적용
- handleRequest()메소드 타입을 String -> MoelAndView로 변경한다
- Model ; Model 정보 저장
- View ; View 정보 저장
<!-- HandlerMapping등록 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/login.do">login</prop>
<prop key="/logout.do">logout</prop>
<prop key="/getBoard.do">getBoard</prop>
<prop key="/getBoardList.do">getBoardList</prop>
<prop key="/insertBoard.do">/insertBoard</prop>
<prop key="/updateBoard.do">/updateBoard</prop>
<prop key="/deleteBoard.do">deleteBoard</prop>
</props>
</property>
</bean>
<!-- Controller등록 -->
<bean id="login" class="com.springbook.view.user.LoginController"></bean>
<bean id="logiout" class="com.springbook.view.user.LogoutController"></bean>
<bean id="getBoard" class="com.springbook.view.board.GetBoardController"></bean>
<bean id="getBoardList" class="com.springbook.view.board.GetBoardListController"></bean>
<bean id="insertBoard" class="com.springbook.view.board.InsertBoardController"></bean>
<bean id="updateBoard" class="com.springbook.view.board.UpdateBoardController"></bean>
<bean id="deleteBoard" class="com.springbook.view.board.DeleteBoardController"></bean>
<!-- ViewResolver등록 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/board/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
Reference