Spring, MVC FrameWork 개발

Controller 분리

기존

  • DispatcherServlet클래스로 Controller를 모두 구현했다
  • 클라이언트의 모든 요청을 하나의 서블릿이 처리한다
  • 개발과 유지보수가 어렵다

해결

  • Sping MVC와 동일한 구조의 프레임워크를 직접 구현하여 적용해본다
  • 중요 => DispatcherServlet클래스는 새로운 기능이 추가되도 변경되지 않는다

    구조

    mvc framework

    1. DispatcherServlet : Client로부터 요청을 받는다
    2. HandlerMappling : 요청path와 일치하는 Controller객체를 반환한다
    3. Controller : 반환된 객체에서 실질적인 사용자 요청 메소드를 실행한다
    4. String : Controller 실행결과로 받은 이동파일 이름
    5. ViewResolver : 이동파일 경로 + 파일 이름을 반환한다
    6. View : 이동할 파일로 이동한다

코드

mvc framework2

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적용

mvc framework3

  • 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

  • 스프링 퀵 스타트-채규태 지음