본문 바로가기
교재 실습/자바 웹 개발 워크북

79. 페이지 컨트롤러의 진화 (1)

by Jint 2022. 7. 27.

프런트 컨트롤러를 도입하면 페이지 컨트롤러를 굳이 서블릿으로 만들어야 할 이유가 없다. 이번 절에서는 페이지 컨트롤러를 일반 클래스로 전환한다. 일반 클래스로 만들면 서블릿 기술에 종속되지 않기 때문에 재사용성이 더 높아진다. 이제 프런트 컨트롤러에서 페이지 컨트롤러로 작업을 위임할 때는 포워딩이나 인클루딩 대신 메서드를 호출해야 한다.

 

1. 프런트 컨트롤러와 페이지 컨트롤러의 호출 규칙 정의

프런트 컨트롤러가 페이지 컨트롤러를 일관성 있게 사용하려면, 다음 그림과 같이 호출 규칙을 정의해야 한다(그림 1).

그림 1 (프런트 컨트롤러와 페이지 컨트롤러의 호출 규칙)

프런트 컨트롤러와 페이지 컨트롤러 사이의 호출 규칙을 문법으로 정의해 두면 개발자들은 그 규칙에 따라 해당 클래스를 작성하고 호출하면 되기 때문에 프로그래밍의 일관성을 확보할 수 있어 유지보수에 도움이 된다. 또한 페이지 컨트롤러를 서블릿이 아닌 일반 클래스로 만들면 web.xml 파일에 등록할 필요가 없어 유지보수가 쉬워진다.

 

2. 호출 규칙 정의

프런트 컨트롤러와 페이지 컨트롤러 사이의 호출 규칙을 정의한다. 이렇게 호출 규칙을 정의할 때 사용하는 문법이 '인터페이스'이다. 즉 인터페이스는 사용자와 피사용자(또는 호출자와 피호출자) 사이의 일관성 있는 사용을 보장하기 위해 만든 자바 문법이다(그림 2).

그림 2 (PageController를 위한 인터페이스)

서블릿으로 작성된 모든 페이지 컨트롤러를 프런트 컨트롤러의 호출 규칙에 맞추어 일반 클래스로 전환한다. 다음 그림은 인터페이스가 적용된 페이지 컨트롤러의 사용 시나리오이다(그림 3).

 

그림 3 (일반 클래스로 만든 페이지 컨트롤러의 사용 시나리오)

① 웹 브라우저는 회원 목록 페이지를 요청한다.

② 프런트 컨트롤러 'DispatcherServlet'은 회원 목록 요청 처리를 담당하는 페이지 컨트롤러를 호출한다. 이때 데이터를 주고받을 바구니 역할을 할 Map 객체를 넘긴다.

③ 페이지 컨트롤러 'MemberListController'는 Dao에게 회원 목록 데이터를 요청한다.

④ MemberDao는 데이터베이스로부터 회원 목록 데이터를 가져와서, Member 객체에 담아 반환한다.

⑤ 페이지 컨트롤러는 Dao가 반환한 회원 목록 데이터를 Map 객체에 저장한다. 그리고 프런트 컨트롤러에게 뷰 URL을 반환한다.

⑥ 프런트 컨트롤러는 Map 객체에 저장된 페이지 컨트롤러의 작업 결과물을 JSP가 사용할 수 있도록 ServletRequest로 옮긴다.

⑦ 프런트 컨트롤러는 보관소에서 뷰의 URL 정보를 꺼내서 해당 JSP로 실행을 위임한다.

 

그림 3에서 중요한 점은 프런트 컨트롤러가 페이지 컨트롤러에게 작업을 위임할 때 더 이상 포워딩이나 인클루딩 방식을 사용하지 않는다는 것이다. 페이지 컨트롤러에게 일을 시키기 위하여 execute() 메서드를 호출한다.

또한, 프런트 컨트롤러와 페이지 컨트롤러 사이에 데이터를 주고받기 위해 Map 객체를 사용하고 있다. 페이지 컨트롤러가 Servlet API를 직접 사용하지 않도록 하기 위함이다. 서블릿 기술에 종속되는 것을 줄일수록 페이지 컨트롤러의 재사용성은 높아진다.

 

3. 페이지 컨트롤러를 위한 인터페이스 정의

페이지 컨트롤러를 위한 인터페이스를 정의한다. spms.controls 패키지를 생성 후 해당 패키지에 Controller 인터페이스를 생성한다.

package spms.controls;

import java.util.Map;

public interface Controller {
    String execute(Map<String, Object> model) throws Exception;
}

execute() 메서드는 프런트 컨트롤러가 페이지 컨트롤러에게 일을 시키기 위해 호출하는 메서드이다. 프런트 컨트롤러가 execute() 메서드를 호출하려면 Map 객체를 매개변수로 넘겨줘야 한다.

 

참고도서 : https://freelec.co.kr/book/1674/

 

[열혈강의] 자바 웹 개발 워크북

[열혈강의] 자바 웹 개발 워크북

freelec.co.kr

댓글