POEAA : 웹 프레젠테이션 패턴
MVC
사용자 인터페이스 상호 작용을 세 가지(모델, 뷰, 컨트롤러) 독립적인 역할로 분할한다.
Model
- 모델은 도메인에 대한 정보 (도메인객체)
- UI에 직접 사용되지 않는 모든 데이터와 동작을 포함하는 비시각적 객체
- 트랜젝션 스크립트도 모델이라고 간주할 수 있다.
View
UI에서 모델을 표시
Controller
사용자로부터 입력을 받고, 모델을 조작하며, 뷰를 적절하게 업데이트 한다. UI는 뷰와 컨트롤러의 조합으로 작동한다.
분리
MVC의 핵심 개념은 프레젠테이션을 모델에서 분리하고, 컨트롤러를 뷰에서 분리하는 두가지 분리다.
1. 프레젠테이션에서 모델 분리
프레젠테이션 -> 모델로 단방향 의존
중요한 것은 모델 작업을 진행하면서 어떤 프레젠테이션을 사용하는지 알 필요가 없다는 것이다. 즉 프레젠테이셔은 유연하게 변경할 수 있다.
하지만 이벤트 통보(notify)라는 개념으로 모델에서 뷰로 의존이 가능하다.
2. 컨트롤러를 뷰에서 분리
어떤 프레임워크에서는 컨트롤러와 뷰를 분리하지 않기도 한다.
하나의 뷰 하나에 컨트롤러 2개를 사용하면 컨트롤러가 뷰에 대한 전략 역할을 한다. 예를 들면 뷰 하나를 수정과 입력 컨트롤러 사용한다. 그 반대로 컨트롤러가 복수개의 뷰를 분기해서 사용할 수 있다.
페이지 컨트롤러
웹 사이트에서 특정 페이지나 동작에 대한 요청을 처리하는 객체
일반적인 컨트롤러(@Controller
)를 말한다.
단순하게 하나의 서버페이지를 사용할 경우 스크립트릿 코드(<% ... %>
)를 사용할 수 있다.
하지만 헬퍼 객체를 사용해서 논리적 처리(Controller처리)를 담당하고 서버페이지(View)를 분리할 수 있다.
기본역할
- 작업에 필요한 데이터 추출
- 처리 : 모델 객체를 생성하고 호출. Request와 같은 요청객체 의존성이 없어야함
- 뷰 결정 후 모델 전달
프런트 컨트롤러
웹 사이트의 모든 요청을 처리하는 컨트롤러
프론트 컨트롤러(Front Controller)는 모든 요청을 단일 처리기 객체로 집중하는 방법으로 요청을 통합 처리한다. 이 객체는 공통적인 동작을 수행하고 데코레이터(decorator)를 사용해 런타임에 수정할 수 있다.
인터셉터 필터
프런트 컨트롤러의 처리기를 래핑해 인증, 로깅, locale 식별 등을 처리하기 위한 필터 체인(필터의 파미프라인)을 만들 수 있다.
프론트 컨트롤러와 같이 사용하면 매우 유용함.
Spring MVC의 DispatcherServlet
가 위 패턴을 바탕으로 개발됨
템플릿 뷰
HTML 페이지에 표시자를 삽입해 정보를 HTML로 렌더링한다.
HTML을 동적으로 표시한 부분과 정적인 부분(템플릿)으로 구성하고 모델을 동적 정보로 렌더링하는 것이다. 일반적으로 많이 사용하는 템플릿 엔진(velocity, freemaker, thymeleaf)이 해당 패턴으로 구현되어 있음
단점
- 일반 디자이너들은 페이지 관리가 힘듬
- 테스트하기가 어려움 (웹서버 의존)
변환 뷰
도메인 데이터 요소를 요소별로 변환하고 HTML로 변환하는 뷰
템플릿 뷰가 HTML을 기반으로 접근했다면 변환 뷰는 모델을 기반으로 접근함
2단계 뷰
도메인 데이터를 먼저 일종의 논리적 페이지로 변환한 다음 이를 다시 HTML로 변환하는 2단계 과정을 통해 HTML로 변환한다.
2번의 변환
- 데이터를 특정한 형식 지정 없이 논리적 프레젠테이션으로 모델링
- 논리적 프레젠테이션에 실제 필요한 형식(HTML)으로 변환
- 공통 룩앤필이나 레이아웃 지원
논리적 프레젠테이션(논리적 화면)
- 필드, 머리글, 꼬리글, 테이블, 옵션 등을 포함할 수 있다.
- 프레젠테이션 기반 모델은 다양한 위젯과 데이터를 포함하지만 HTML 외형을 지정하지 않는 모델이라고 생각하면 된다.
구현방법
- XSLT
- 클래스 분리
- 테이블 클래스, 행 클래스 등 : ex) 닷넷 웹폼 구성요소 클래스
- render 메소드로 HTML 변환
어플리케이션 컨트롤러
화면 이동(뷰 선택)과 애플리케이션 흐름(도메인 로직)을 처리하는 중심 지점
같은 종류의 컨트롤러가 특정 조건에 반복되는 경우가 있는데, 이를 해결하기 위함이다. 예를 들면 회원가입 시 특정 상태 부가정보 입력 분기 시
입력 컨트롤러는 애플리케이션 컨트롤러로부터 모델을 대상으로 실행할 명령과 애플리케이션의 상태에 따라 사용할 올바른 뷰에 대한 정보를 얻을 수 있다.
작동원리
- 도메인 논리 선택
- 뷰 선택
사용시점
객체의 상태에 따라 다른 뷰를 표시하며 페이지를 표시하는 순서에 대한 명확한 규칙이 있을 떄
애플리케이션 흐름이 변경될 때 여러 곳에서 비슷한 변경이 필요하다면 애플리케이션 컨트롤러가 필요하다는 신호