[Servlet&JSP] FrontController, HandlerMapping, POJO logic

KKS·2023년 8월 16일
post-thumbnail

개요

Controller는 클라이언트의 요청을 받아 DAO를 연동하고 페이지 전환을 위해 redirect를 할것인지, forward로 보낼 것인지 결정한다.
클라이언트의 요청이 다양해질수록 Controller의 복잡성이 커질 것이고, 요청에 따라 if~ else문으로 분기하는 작업이 번거롭게 된다. 따라서, 클라이언트의 모든 요청을 받는 FrontController와 각각의 세부 Controller인 POJO를 생성함으로써 하나의 Controller가 수행하는 작업을 분담할 필요성이 있다.

1. FrontController

  • 클라이언트의 모든 url 요청을 받고, 어떤 요청이 왔는지 추출한다.
  • command변수는 key값으로 HashMap이 있는 HandlerMapping으로 전달될 것이다.
String url = request.getRequestURI();
String ctx = request.getContextPath();
String command = url.substring(ctx.length());

2. HandlerMapping

  • HandlerMapping이란, 클라이언트가 요청한 특정 url과 그 url에 해당하는 POJO를 연결시키는 작업이다.
  • HandlerMapping작업을 위해 HashMap을 이용한다.
  • FrontController에서 추출한 url을 key값으로 getPOJO(String key)메서드로 전달하면, HashMap에 미리 저장해놓은 POJO객체를 value로 반환한다.
public class HandlerMapping {

	private HashMap<String, Controller> mappings;
	
	Controller controller = null;
	String nextPage = null;
	
	public HandlerMapping() {
		
		mappings = new HashMap<String, Controller>();
		
		mappings.put("/memberRegister.do", new MemberRegisterController());
		mappings.put("/memberContent.do", new MemberContentController());
		mappings.put("/memberDelete.do", new MemberDeleteController());
		mappings.put("/memberInsert.do", new MemberInsertController());
		mappings.put("/memberList.do", new MemberListController());
		mappings.put("/memberUpdate.do", new MemberUpdateController());

	}

	public Controller getPOJO(String key) {
		
		return mappings.get(key);
	}
	
}

3. POJO(Plain Old Java Object)

  • POJO는 Servlet이 아닌 일반 Java클래스로 생성한다.
  • FrontController가 대표 안내원 Controller라면, POJO는 이를 보조하는 안내원 Controller라고 할 수 있다.
  • 해당하는 POJO의 requestHandler()메서드가 호출되면 DAO연동, 객체바인딩을 수행하고 nextPage를 반환한다.
public String requestHandler(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
            
			MemberDAO dao = new MemberDAO();
			ArrayList<MemberVO> list = dao.memberList();
		
			request.setAttribute("list", list);
		
			return "WEB-INF/member/memberList.jsp";
            
            }

4. 다시, FrontController

  • POJO로부터 반환받은 nextPage문자열에 "redirect:"이 있으면 Redirect, 없으면 Forward로 페이지 전환을 수행한다.
		if(nextPage != null) {
			if(nextPage.indexOf("redirect:") != -1) {
				response.sendRedirect(nextPage.split(":")[1]);
			} else {
				RequestDispatcher rd = request.getRequestDispatcher(nextPage);
				rd.forward(request, response);
			}
		}

정리

  1. 모든 클라이언트의 요청을 FrontController에서 받는다.
  2. FrontController에서 HandlerMapping으로 요청url을 보낸다.
  3. HandlerMapping에서 FrontController로 url에 해당하는 POJO객체를 반환한다.
  4. FrontController에서 POJO객체를 사용하여 DAO연동, 객체바인딩을 시키고 nextPage를 반환받는다.
  5. nextPage를 기반으로 FrontController에서 Redirect 또는 Forward를 결정한다.
profile
공부하고 이해한 내용들을 직접 그림과 표를 그리면서 정리해보는 공간입니다.🤗

1개의 댓글

comment-user-thumbnail
2023년 8월 16일

이렇게 유용한 정보를 공유해주셔서 감사합니다.

답글 달기