티스토리 뷰


앞에서는 클라이언트의 요청 처리를 서블릿 홀로 담당하는 All-in-One 방식에 대해 살펴보았다.


All-in-One 방식은 규모가 크거나 업무 변경이 많은 경우에는 유지보수가 어려워 운영 비용이 증가하게 된다. 시스템 변경이 잦은 상황에서 유지보수를 보다 쉽게하려면, 중복 코드의 작성을 최소화하고, 코드 변경이 쉬워야 한다. 이를 위해서는 객체 지향의 특성을 활용하여 좀 더 역할을 세분화하고 역할 간 의존성을 최소화하여야 한다. 그리하여 제안된 것이 MVC(Model-View-Controller) 아키텍처이다.


MVC 구조에서는 클라이언트의 요청 처리를 서블릿 혼자서 담당하지 않고 세 개의 컴포넌트가 나누어 처리한다.


컨트롤러 컴포넌트의 역할은, 클라이언트의 요청을 받았을 때 그 요청에 대해 실제 업무를 수행하는 모델 컴포넌트를 호출하거나, 클라이언트가 보낸 데이터가 있다면 모델을 호출할 때 전달하기 쉽게 데이터를 가공하는 일을 한다. 그리고 모델이 업무 수행을 완료하면 그 결과를 가지고 화면을 생성하도록 뷰에게 전달한다.


모델 컴포넌트의 역할은 데이터 저장소와 연동하여 사용자가 입력한 데이터나 사용자에게 출력할 데이터를 다루는 일을 한다. 특히 여러 개의 데이터 변경 작업(추가, 변경, 삭제)을 하나의 작업으로 묶은 트랜잭션을 다루는 일도 한다.


 컴포넌트의 역할은 모델이 처리한 데이터나 그 작업 결과를 가지고 사용자에게 출력할 화면을 만든다.

이렇게 역할을 나누어 작업을 처리하는 방식은 객체지향 프로그래밍의 특징이다. 가능한 역할을 작은 단위로 나누면 다른 프로젝트에서 재사용할 가능성이 높아진다. (모델 컴포넌트가 작업한 결과를 다양한 뷰 컴포넌트를 통하여 출력이 가능하다.) 그리고 자바 개발자는 컨트롤러와 모델 개발에 전념하고, JSP 개발자나 HTML 개발자는 뷰 개발에만 전념할 수 있기 때문에, 업무집중도가 높아져서 개발 속도가 빨라진다.


우선 뷰 컴포넌트를 살펴보면,

기존에 서블릿이 하던 작업 중에서 화면 출력과 관련된 기능은 JSP 를 사용하여 처리한다. JSP 엔진이 자바 출력문을 만들기 때문에 개발자가 자바로 출력문을 작성할 필요가 없이, 보다 쉽게 HTML 화면을 만들고 클라이언트로 출력한다.



그리고 데이터베이스에서 가져온 정보를 JSP 페이지에 전달하려면 그 정보를 담을 객체가 필요하다. (값 객체(VO) = 데이터 수송 객체(DTO))

ServletRequest는 클라이언트의 요청을 다루는 기능외에 어떤 값을 보관하는 보관소 기능도 있어, 이를 통해 서블릿에서 JSP로 데이터를 전달할 수 있다.



JSP 페이지를 작성할 때, 가능한 자바 코드의 삽입을 최소화하는 것이 유지보수에 좋다. JSP 전용 태그 중에서 액션은 자바 객체를 생성하거나 request 객체에서 값을 꺼내는 작업을 쉽게 처리할 수 있다. (비즈니스로직과 프리젠테이션 로직을 나눠서 개발이 가능해진다.) 그러나 이런 부분들도 최근에 들어서는 JSP 액션태그보다는 오히려 HTML, CSS, Javascript 기술이 더 요구되고 있다. JSP 전용태그를 많이 쓸수록 JSP 기술에 더 종속되기 때문이다.




다음으로 모델 컴포넌트를 만들기 위해서는,

서블릿으로부터 데이터 처리로직을 분리하여 DAO를 정의하여야 한다. DAO는 데이터베이스나 파일, 메모리 등을 이용하여 애플리케이션 데이터를 생성, 조회, 변경, 삭제하는 역할을 수행한다. DAO를 도입할 경우 데이터 처리 부분을 공유함으로써 중복 코드를 줄일 수 있고, 데이터 구조에 변경이 발생하면 그 변경사항을 적용하기 쉽다. 또한, 다른 프로젝트에서 재사용하기가 쉽다.



그런데 DAO의 경우처럼 여러 서블릿이 사용하는 객체는, 서로 공유하는 것이 메모리 관리나 실행속도 측면에서 좋다. 요청에 따라 객체를 만들게 되면 Garbage가 생성되고, 실행 시간이 길어지기 때문이다. DAO를 공유하려면 ServletContext(application)에 저장하는 것도 좋으나, 더 좋은 방법은 이벤트를 이용하는 것이다.


서블릿 컨테이너는 웹 애플리케이션의 상태를 모니터링할 수 있도록 웹 애플리케이션의 시작에서 종료까지 주요한 사건에 대해 알림기능을 제공한다. 이런 알림 기능을 이용하려면 규칙에 따라 ServletContextListener의 구현체를 만들고, DD파일(web.xml)에 등록하면 된다.






이제 MVC 아키텍처의 컴포넌트 중 컨트롤러만 남았다.


컨트롤러를 만들다보면 요청 데이터를 처리하는 코드나, 모델과 뷰를 제어하는 코드가 중복되는 경우가 있다. 이런 부분은 컨트롤러를, 프런트 컨트롤러와 페이지 컨트롤러로 나누어 해결할 수 있다.

프런트 컨트롤러는 이름에서 알 수 있듯이 제일 앞에서 클라이언트의 요청을 받는 서블릿이다. 기존에 컨트롤러들이 하던 일 중에서 공통 작업을 처리한다. 페이지 컨트롤러는 특정 요청을 위한 작업을 수행한다. 즉 JSP가 사용할 데이터를 준비한다거나 데이터 처리가 끝났을 때 어떤 JSP를 실행해야 하는지 프런트 컨트롤러에게 알려주는 일을 한다.



(솔직히 리플랙션 API, 프로퍼티를 이용한 객체 관리, 애노테이션을 이용한 객체 관리, 그리고 IoC 컨테이너 등 책의 후반부는 확실히 이해가 되지 않는 듯하다. 추가적인 학습 후에 내용을 보강할 계획이다.)


MVC 아키텍처를 적용하고 보니 All-in-One 방식일 때의 서블릿보다 코드 가독성이 좋아졌음을 알 수 있다. 그런데 DB와 연결하는 부분의 코드는 좀 더 깔끔하게 할 수 없을까?







참조 : 열혈강의 웹 개발 워크북



'Programming > .java' 카테고리의 다른 글

불변객체란  (2) 2020.04.12
일급컬렉션에 대하여  (0) 2020.03.30
스프링 프레임워크에 이르기까지 <1> All-in-one  (0) 2017.09.23
[Java]Collections Class  (0) 2017.08.26
[Java]String vs StringBuffer vs StringBuilder  (0) 2017.08.25
댓글
링크
최근에 달린 댓글
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Total
Today
Yesterday