본문 바로가기

Dev.BackEnd/Servlet&JSP

#미니 MVC FrameWork 만들기 첫번째 단계, 컨트롤러의 분리

미니 MVC Framework 만들기 첫번째 단계,

DispatchServlet(Front-Controller)과 Controller들(Page-Controller)로 분리

문제점 착안,
기존의 아키텍쳐에서는 하나의 서블릿에서 요청을 받고 각각의 모델에 해당하는 작업들을 요청하는 방식이었다.
이렇게 되면 각각의 컨트롤러의 몸집이 거대해진다.
그리고 각각의 서블릿이 한 가지 역할을 수행하는 서블릿이므로 코드의 재사용성이 떨어진다.
(코드를 살펴보면 중복되는 코드가 많다는 것을 알 수 있다.)

그래서 프런트 컨트롤러와 페이지 컨트롤러 두 가지로 컨트롤러를 분리하려고 한다.

설계
프런트 컨트롤러는 요청을 받고 그에 맞는 응답을 전달하는 서블릿으로 그 역할을 제한한다.
프런트 컨트롤러의 역할은 브라우저로부터 오는 요청을 모두 수용한다.
그리고 나서 요청에 맞는 페이지 컨트롤러로 수행을 위임한다.

페이지 컨트롤러는 일반 자바 클래스로서 전달받은 요청에 대한 역할을 수행하게 된다.
페이지 컨트롤러는 모델과 협력하여 요청에 맞는 작업을 수행하여, 결과물을 다시 프런트 컨트롤러에 전달한다.
프런트 컨트롤러는 전달받는 데이터를 가지고 View와 함께 요청에 맞는 페이지를 생성한다.
그리고 그 페이지를 브라우저에게 전달한다.


구체화
Page-Controller들은 동일한 기능을 수행해야 하므로 하나의 인터페이스를 기준으로 동일한 역할을 수행한다.
=> Controller.interface 생성
페이지 컨트롤러의 역할은 프런트 컨트롤러로부터 전달받은 요청에 해당하는 작업을 수행한다.
=> MemberDao를 생성하여, Model과 협력한다.
public String execute(Map<String, Object> model) throws Exception {
	model.put("members", memberDao.selectList());
	return "/member/MemberList.jsp";
}
이 때 프런트 컨트롤러와 페이지 컨트롤러가 데이터를 주고 받아야 하는데,
HashMap이라는 자료구조를 사용하여 데이터를 주고 받는다.
일종의 운송수단인 것이다.
기존의 Member 객체를 통해 값을 넘겨받고 MemberDao를 통해 작업을 수행한 결과를 다시 HashMap을 통해 전달하는 것이다.


DispatcherSevlet이 프런트 컨트롤러 역할을 수행하게 되고,
분화된 각각의 LogInController, MemberListController 등

Controller Interface를 구현한 클래스들이 페이지 컨트롤러 역할을 수행하게 된다. 


End