01. 모델 2구조와 MVC 패턴
JSP 기반 웹 어플리케이션의 구조에는 크게 모델1구조와 모델2구조가 있다. JSP 에서 모든 로직과 출력을 처리하느냐 아니면 JSP에서 출력만 처리하느냐에 따라서 모델 1구조와 모델2구조로 구분된다.
1.1 모델1구조
모델1구조는 JSP를 이용한 단순한 모델이다. 지금까지 살펴본 거의 대부분의 JSP 페이지가 모델1구조를 사용하고 있다. 보통 처음 JSP를 배울때 사용하는 구조가 모델1구조인데 웹브라우저의 요청이 곧바로 JSP에 전달된다. 웹 브라우저의 요청을 받은 JSP는 자바빈이나 서비스 클래스를 사용해서 웹 브라우저가 요청한 작업을 처리하고 그 결과를 클리이언트에 출력해 준다.
JSP 페이지에서 웹 브라우저가 요청한 것들을 처리한다는것은 JSP 페이지에 비즈니스로직을 처리하기 위한 코드와 웹 브라우저에 결과를 보여줄출력 관련 코드가 섞인다는 것을 의미한다. 원하는 작업을 수행하고 그 결과를 출력하는 경우가 많은데 이것이 모델 1구조의 전형적인 예이다.
1.2 모델2구조
모델 2구조는 모델1구조와 달리 웹 브라우저의 요청을 하나의 서블릿이 받게 된다. 서블릿은 웹 브라우저의 요청을 알맞게 처리한후 그 결과를 보여줄 JSP 페이지로 포워딩한다. 포워딩을 통해서 요청 흐름을 받은 JSP 페이지는 결과화면을 클라이언트에 전송한다. 즉 서블릿이 비즈니스 로직 부분을 처리하게 되는 것이다.
모델2구조의 특징은 웹 브라우저의 모든 요청이 단일 진입점, 즉 하나의 서블릿에서 처리된다는 점이다. 하나의 서블릿이 우베 브라우저의 모든 요청을 받기 때문에 서블릿은 웹 브라우저의 요청을 구분할수 있는 방법을 필요로 하며, 서블릿은 웹 브라우저의 요청을 처리한 후 웹 브러우저에 보여줄 JSP를 선택하게 된다. 모델2구조의 이런한 특징 때문에 MVC패턴에 기반을 두어 웹 어플리케이션을 구현할때는 모델 2구조를 주로 사용한다.
1.3 MVC 패턴
스몰토크라는 프로그래밍 언어에서 사용되는 패턴이었는데 스윙과 같은 UI 컴포넌트로 그활용범위가 확정되었으며 JSP에서 모델2구조가 나오면서 웹 어플리케이션 개발 영역에서도 보편적으로 사용하기 시작했다.
MVC 패턴은 크게 모델, 뷰, 컨트롤러의 세부분으로 구성되면 역할은 다음과 같다.
모델 : 비즈니스 영역의 상태 정보를 처리한다.
뷰 : 비즈니스 영역에 대한 프리젠테이션 뷰를 담당한다.
컨트롤러 : 사용자의 입력 및 흐름제어를 담당한다.
사용자는 원하는 기능을 처리하기 위한 모든 요청을 단일 컨트롤러에 보낸다. 모델은 비느지스와 관련된 상태 정보 및 관련 기능을 제공하는데 컨트롤러는 이 모델을 통해서 사용자의 요청을 처리한다. 모델을 사용하여 알맞은 비즈니스 로직을 수행한후 컨트롤러는 사용자에게 보여줄 뷰를 서낵하며 선택된 뷰는 사용자에게 알맞은 결과 화면을 보여준다. 뷰가 사용자에게 결과화면을 보여줄때에는 결과 정보가 필요한데 컨트롤러가 이 정보를 뷰에 전달해 준다.
MVC 핵심 패턴
ㅇ 비즈니스로직을 처리하는 모델과 결과 화면을 보여주는 뷰가 분리되어 있다.
ㅇ 어플리케이션의 흐름제어나 사용자의 처리 요청은 컨트롤러에 집중된다.
즉 모델은 오직 비즈니스와 관련된 부분을 처리하면 될 뿐 사용자에게 보여줄 화면이나 흐름제어에 대한 처리할 필요가 없다. 반대로 뷰는 사용자에게 알맞은 화면을 보여주는 역할만 수행하면 될 뿐, 비즈니스 로직이나 흐름제어등을 신켱쓸 필요가 없다. 이렇게 모델과 뷰가 분리되어 있기 때문에 모델의 내부 로직이 변경된다 하더라도 뷰는 영향을 받지 않으며, 뷰와 모델이 결합되어 있지 않기 때문에 뷰를 얼벼지 않게 변경할수 있다.
또한 컨트롤러는 사용자의 요청에 대해서 알맞은 모델을 사용하고 사용자에게 보여줄 뷰를 선택하기만 하면 된다. 비즈니스 로직에는 포함되지 않지만 전체 웹 어플리케이션에 일괄적으로 적용되는 기능을 컨트롤러에 집중적으로 처리하게 된다.
웹 어플리케이션의 흐름 제어나 보안 설정의 변경등과 같은 유지 보수 작업이 필요할 경우 컨트롤러만 변경하면 되고, 새로운 타입의 사용자가 새롭게 추가될때에는 컨트롤러나 모델에 상광없이 새로운 뷰를 추가해 주면된다. 즉 MVC 패턴을 사용함으로써 유지 보수 작업이 간단해지고 어플리케이션을 쉽게 확장할수 있게 되는 것이다.
1.4 MVC 패턴과 모델 2구조의 매핑
ㅇ 컨트롤러 = 서블릿
모델 = 비즈니스 로직 처리 클래스, 자바빈
뷰 = JSP
사용자 = 웹 브라우저 내지 휴대폰과 같은 다양한 기기
1.5 MVC의 컨트롤러 : 서블릿
모델2구조에서 서블릿은 MVC 패턴의 컨트롤러 역할을 한다. 서블릿은 웹 브라우저의 요청과 웹 어플리케이션의 전체적인 흐름을 제어하게 된다.
과정1 : 웹 브라우저가 전송한 HTTP 요청을 받는다. 서블릿의doGet() 메서드나 do POST() 메서드가 호출된다.
과정2: 웹 브라우저가 어떤 기능을 요청했는지 분석한다. 예를 들어 게시판 목록을 쵸청했는지, 글 쓰기를 요청했는지 알아낸다.
과정3: 모델을 사용하여 요청한 기능을 수행한다.
과정4: 모델로 부터 전달받은 결과물을 알맞게 가공한후 request 나 session의 setAttribute()메서드를 사용하여 결과값을 속성에 저장한다. 이렇게 저장된 결과값은 뷰인 JSP에서 사용된다.
과정5: 웹브라우저에 보여줄 JSP를 선택한후 해당 JSP로 포워딩 한다. 경우에 따라서 리다이렉트를 하기도 한다.
서블릿은 모델이 내부적으로 어떻게 비즈니스로직을 처리하는지 알 필요 없이, 웹브라우저의 요청에 알맞게 모델을 사용하여 요청한기능을 수행하고 그 결과를 뷰인 JSP에 전달해 주기만 하면 된다. 웹 브라우저의 결과를 보여줄 JSP 페이지는 컨트롤러 서블릿이 선택하게 되며 요청 처리 결과를 request 나 session에 저장해서 뷰 역할을 하게 되는 JSP 페이지에 전달한다.
1.6 MVC의 뷰 : JSP
모델2구조에서 JSP는 뷰의 역할을 담당한다. 비즈니스 로직과 관련된 코드가 없는 점을 제외하면 일반 JSP와 거의 동일한 형태를 취한다. 뷰역할을 하는 JSP는 컨트롤러 부분에서 request 기본 객체나 session 기본 객체에 저장한 데이터를 사용하여 웹 브라우저에 알맞은 겨로가를 출력해 준다는 점이다. 뷰 JSP의 경우는 컨트롤러 서블릿 처럼 일반적인 처리 순서가 정해져 있지는 않다.
뷰 열할을 하는 JSP 는 웹 브라우저가 요청한 겨로가를 보여주는 프리젠 테이션 역할을 할 뿐만아니라 웹 브라우저의 요청을 컨트롤러에 전달해 주는 매개체가 되기도 한다.
예를들어 웹 브라우저가 게시판 글 목록 보기를 요청하여 그 결과가 뷰를 사용하여 출력되었다고 해보자. 글쓰기와 같은 링크가 존재 할것이며 글쓰기 링크는 컨트롤러에 연결되어 있을것이다.