실무에서 다년간 다양한 업무 시스템에 적용되고 검증되어 좋다고 증명된 방법을 최선의 관행(best practice)이라고 한다. 실무 웹 애플리케이션 개발에 있어 최선의 관행으로 알려진 'MVC 아키텍처(Architecture)'에 대해 알아보며, 서블릿의 단점을 보완하기 위해 등장한 JSP(JavaServer Page)라는 기술도 함께 배운다.
먼저 MVC 아키텍처의 구성요소인 모델(model), 뷰(view), 컨트롤러(controller)의 역할과 구동원리를 알아본다.
이전까지의 예제에서는 클라이언트의 요청 처리를 서블릿 홀로 담당하는 올인원(All-in-one)방식이었다(그림 1).
글로벌 환경에서의 기업들은 더 짧은 주기로 제품이나 서비스를 제공하는데, 이를 위해서는 조직이나 업무 프로세스가 자주 바뀌게 되어 잦은 시스템 변경이 요구된다. 시스템 변경이 잦은 상황에서 유지보수를 쉽게 하려면 중복 코드의 작성을 최소화하고 코드 변경이 쉽도록 기존 코드의 재사용성을 높이는 방향으로 설계를 해야 한다. 객체 지향의 특성을 활용하여 더 역할을 세분화하고 역할 간 의존성을 최소화한다면 변화무쌍한 업무 환경에 대응하기 쉬운 시스템을 개발할 수 있을 것이다. MVC 아키텍처는 이런 현실을 반영한 시스템 설계 방식으로 현재 대부분 기업용 애플리케이션 개발에 적용되는 아키텍처 패턴이다(그림 2).
MVC 구조에서는 클라이언트의 요청 처리를 서블릿 혼자서 담당하지 않고 세 개의 컴포넌트가 나누어 처리한다.
- MVC의 각 컴포넌트 역할
컨트롤러(controller) 컴포넌트 : 클라이언트의 요청을 받았을 때 그 요청에 대해 실제 업무를 수행하는 모델 컴포넌트 호출. 클라이언트가 보낸 데이터가 있다면, 모델 호출 시 전달하기 쉽게 데이터 적절히 가공. 모델이 업무 수행을 완료하면 그 결과를 가지고 화면을 생성하도록 뷰에게 전달. 즉, 클라이언트 요청에 대해 모델과 뷰를 결정하여 전달하는 역할을 한다. 일종의 조정자라 할 수 있다.
모델(model) 컴포넌트 : 데이터 저장소(데이터베이스, 디렉터리 서비스 등)와 연동하여 사용자가 입력한 데이터나 사용자에게 출력할 데이터를 다루는 일을 한다. 여러 개의 데이터 변경 작업(추가, 변경, 삭제)을 하나의 작업으로 묶은 트랜잭션을 다루는 일도 한다.
뷰(view) 컴포넌트 : 모델이 처리한 데이터나 그 작업 결과를 가지고 사용자에게 출력할 화면을 만든다. 이렇게 생성된 화면은 웹 브라우저가 출력하는데 뷰 컴포넌트는 HTML과 CSS, JavaScript를 사용하여 웹 브라우저가 출력할 UI를 만든다.
- MVC 이점
MVC 구조를 적용하여 프로그램을 짰을 때 올인원 방식과 비교하면 다음과 같은 이점이 있다.
▶ 높은 재사용성, 넓은 융통성
1. 룩앤필(look and feel)을 쉽게 교체 가능하다. 화면 생성 부분을 별도의 컴포넌트로 분리하였기 때문에 컨트롤러나 모델에 상관없이 뷰 교체만으로 배경색이나 모양, 레이아웃, 글꼴 등 사용자 화면을 쉽게 바꿀 수 있다.
2. 원 소스 멀티 유즈(one source multi use)를 구현할 수 있다. 모델 컴포넌트가 작업한 결과를 다양한 뷰 컴포넌트를 통하여 PDF나 HTML, XML, JSON(JavaScript Object) 등 클라이언트가 원하는 형식으로 출력할 수 있다.
3. 코드를 재사용할 수 있다. 화면을 바꾸거나 데이터 형식을 바꾸더라도 모델 컴포넌트는 그대로 재사용할 수 있다.
▶ 빠른 개발, 저렴한 비용
1. 다른 프로젝트에서도 모델 컴포넌트를 재사용할 수 있어 개발 속도가 빨라진다. 자바 개발자는 컨트롤러와 모델 개발에 전념하고 JSP 개발자나 HTML 개발자는 뷰 개발에 전념할 수 있기 때문에 업무 집중도가 높아져 개발 속도가 빨라진다.
2. 소스 코드를 역할에 따라 여러 컴포넌트로 쪼개게 되면, 그 컴포넌트의 난이도에 따라 좀 더 낮은 수준의 개발자를 투입할 수 있어서 전체적인 개발 및 유지보수 비용을 줄일 수 있다.
- MVC 구동 원리
MVC 아키텍처를 적용한 전형적인 웹 애플리케이션의 모습이다(그림 3). 클라이언트 요청에서 화면 출력까지의 과정을 살펴본다.
1. 요청
웹 브라우저가 웹 애플리케이션 실행을 요청하면, 웹 서버가 그 요청을 받아서 서블릿 컨테이너(톰캣 서버 등)에 넘겨 준다. 서블릿 컨테이너는 URL을 확인하여 그 요청을 처리할 서블릿을 찾아 실행한다.
2. 서블릿은 실제 업무를 처리하는 모델 자바 객체의 메서드를 호출한다. 만약 웹 브라우저가 보낸 데이터를 저장하거나 변경해야 한다면 그 데이터를 가공하여 값 객체(VO : Value Object)를 생성하고, 모델 객체의 메서드를 호출할 때 인자값으로 넘긴다. 모델 객체는 엔터프라이즈 자바빈(EJB : Enterprise JavaBeans)일 수도 있고, 일반 자바 객체(POJO : plain old java object)일 수도 있다.
3. 모델 객체는 JDBC를 사용하여 매개변수로 넘어온 값 객체를 데이터베이스에 저장하거나, 데이터베이스로부터 질의 결과를 가져와서 값 객체로 만들어 변환한다. 이렇게 값 객체는 객체와 객체 사이에 데이터를 전달하는 용도로 사용하기 때문에 데이터 전송 객체(DTO : Data Transfer Object)라고도 부른다.
4. 서블릿은 모델 객체로부터 반환받은 값을 JSP에 전달한다.
5. JSP는 서블릿으로부터 전달받은 값 객체를 참조하여 웹 브라우저가 출력할 결과 화면을 만든다. 그리고 웹 브라우저에 출력함으로써 요청 처리를 완료한다.
6. 웹 브라우저는 서버로부터 받은 응답 내용을 화면에 출력한다.
MVC 아키텍처로 구성하게 되면 클라이언트 요청 처리에 여러 컴포넌트가 개입하게 되므로 코드 해석이 어려워질 수 있으나 MVC 아키텍처에 익숙해지면, 코드들이 역할 단위로 분리되어 있어 유지 보수하기가 쉽다.
참고도서 : https://freelec.co.kr/book/1674/
[열혈강의] 자바 웹 개발 워크북
[열혈강의] 자바 웹 개발 워크북
freelec.co.kr
'교재 실습 > 자바 웹 개발 워크북' 카테고리의 다른 글
36. 뷰 컴포넌트와 JSP (2) (0) | 2022.02.02 |
---|---|
35. 뷰 컴포넌트와 JSP (1) (0) | 2022.02.01 |
33. 필터 사용하기 (2) (0) | 2022.01.30 |
32. 필터 사용하기 (1) (0) | 2022.01.29 |
31. 컨텍스트 초기화 매개변수 (0) | 2022.01.28 |
댓글