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

75. 프런트 컨트롤러의 도입 (1)

by Jint 2022. 7. 21.

이번 절에서는 '프런트 컨트롤러'라는 디자인 패턴을 이용하여 좀 더 유지보수가 쉬운 구조로 MVC를 개선해본다. 컨트롤러를 만들다 보면 요청 데이터를 처리하는 코드나 모델과 뷰를 제어하는 코드가 중복되는 경우가 있다. 중복 코드들은 유지보수를 어렵게 하므로 프런트 컨트롤러를 통해 이 문제를 해결해본다.

 

1. 프런트 컨트롤러 패턴

다음 그림은 프런트 컨트롤러를 적용한 MVC 구조도와 클아이언트 요청을 처리하는 절차이다(그림 1).

그림 1 (프런트 컨트롤러를 적용한 MVC 구조도)

① 웹 브라우저에서 요청이 들어오면, 제일 먼저 프런트 컨트롤러에서 그 요청을 받는다. 프런트 컨트롤러는 VO 객체를 생성하여 클라이언트가 보낸 데이터를 담는다. 그리고 ServletRequest 보관함에 VO 객체를 저장한다. 요청 URL에 따라 페이지 컨트롤러를 선택하여 실행을 위임한다.

② 페이지 컨트롤러는 DAO를 사용하여 프런트 컨트롤러로부터 받은 VO 객체를 처리한다.

③ DAO는 페이지 컨트롤러로부터 받은 데이터를 처리한다.

④ DAO 호출이 끝나면, 페이지 컨트롤러는 화면을 만들 때 사용할 데이터를 준비한다. 그리고 JSP가 사용할 수 있도록 ServletRequest 보관소에 저장한다. 프런트 컨트롤러에게 화면 출력을 담당할 뷰 정보(JSP의 URL)를 반환한다.

⑤ 프런트 컨트롤러는 페이지 컨트롤러가 알려준 JSP로 실행을 위임한다. 만약 오류가 발생한다면 'Error.jsp'로 실행을 위임한다.

⑥ JSP는 페이지 컨트롤러에서 준비한 데이터를 가지고 화면을 생성하여 출력한다. 프런트 컨트롤러는 웹 브라우저의 요청에 대한 응답을 완료한다.

 

이전 장에서 배운 MVC는 컨트롤러가 하나였지만, '프런트 컨트롤러' 디자인 패턴에서는 두 개의 컨트롤러를 사용하여 웹 브라우저 요청을 처리한다. 즉 기존에 서블릿이 단독으로 하던 작업을 프런트 컨트롤러와 페이지 컨트롤러로, 이렇게 두 개의 역할로 나누어 수행한다.

앞의 구조도에서 보는 것처럼 프런트 컨트롤러는 VO 객체의 준비, 뷰 컴포넌트로의 위임, 오류 처리 등과 같은 공통 작업을 담당하고, 페이지 컨트롤러는 이름 그대로 요청한 페이지만을 위한 작업을 수행한다.

 

- 디자인 패턴

아무리 자바 가상 머신이 가비지를 찾아서 자동으로 없애 준다 해도, 이 작업 또한 CPU를 사용하는 일이기에 시스템 성능에 영향을 끼친다. 따라서 개발자는 늘 인스턴스의 생성과 소멸에 대해 관심을 가지고 시스템 성능을 높일 수 있는 방향으로 구현해야 한다. 또한, 중복 작업을 최소화하여 유지보수를 좋게 만드는 방법을 찾아야 한다. 이것은 개발자의 의무이다.

이런 개발자들의 노력은 시스템에 적용되어 많은 시간 동안 시스템이 운영되면서 검증된다. 디자인 패턴은 이렇게 검증된 방법들을 체계적으로 분류하여 정의한 것이다. 디자인 패턴은 이미 실무에서 사용되고 검증된 방법이기 때문에 시스템 개발에 디자인 패턴을 활용하면 시행착오를 최소화할 수 있다(그림 2).

그림 2 (디자인 패턴)

 

- 프레임워크

디자인 패턴이 특정 문제를 해결하기 위한 검증된 방법이라면, 프레임워크(FrameWork)는 이런 디자인 패턴을 적용해 만든 시스템 중에서 우수 사례(Best Practice)를 모아 하나의 개발 틀로 표준화시킨 것이다(그림 3).

그림 3 (디자인 패턴과 프레임워크)

프레임워크의 대표적인 예로 국내외적으로 많이 사용하고 있으며 범용 시스템 개발에 사용할 수 있는 스프링 프레임워크가 있으며 스프링 프레임워크보다 기능은 작지만, 웹 MVC 프레임워크로 특화된 스트럿츠가 있다. 국내에서는 스트럿츠보다는 스프링 MVC 프레임워크를 더 많이 사용한다.

MyBatis(이전 iBatis)는 데이터베이스 연동을 쉽게 해주는 프레임워크이다. MyBatis를 사용하면 개발자는 더 이상 JDBC 프로그래밍을 할 필요가 없다. 자바스크립트를 위한 MVC 프레임워크도 있다. Angular와 Ember가 요즘 주목받는 자바스크립트 프레임워크이다.

 

2. 프런트 컨트롤러를 통해 회원 목록 출력

다음 그림은 프런트 컨트롤러를 통해 회원 목록을 출력하는 시나리오이다(그림 4).

그림 4 (프런트 컨트롤러가 적용된 MVC 구동 시나리오)

① 웹 브라우저는 '/member/list.do'를 요청한다.

② 프런트 컨트롤러 'DistpatcherServlet'은 클라이언트가 요청한 서블릿으로 실행을 위임한다.

③ 페이지 컨트롤러 'MemberListServlet'은 MemberDao에게 회원 목록을 요청한다.

④ MemberDao는 데이터베이스로부터 회원 정보를 가져와서 Member 객체에 담는다. 그리고 Member 목록을 반환한다.

⑤ 페이지 컨트롤러는 Member 목록을 JSP에서 사용할 수 있도록 ServletRequest 보관소에 저장한다.

⑥ 또한, 페이지 컨트롤러는 회원 목록 화면을 출력할 뷰의 URL(/member/MemberList.jsp) 정보를 보관소에 저장한다.

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

⑧ MemberList.jsp는 ServletRequest 보관소에 저장된 Member 목록을 꺼낸다.

⑨ MemberList.jsp는 Member 객체들의 데이터를 이용하여 회원 목록 화면을 출력한다.

⑩ 웹 브라우저에게 응답을 완료한다.

 

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

 

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

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

freelec.co.kr

댓글