📌MVC 패턴 개요
WebProgramming 카테고리에서 Servlet부분을 보면 알겠지만 처음 서블릿이 나왔을 때 클라이언트의 요청 처리를 서블릿 홀로 담당하는 올인원 방식이었다. 서블릿이 요청 데이터 처리도하고 비즈니스 로직 및 데이터 처리도 하고 결과 화면도 생성한 것이다. 이는 장점도 있지만 규모가 커지게 되거나 시스템 변경이 잦은 경우에는 오히려 유지 보수가 어려워 운영 비용이 증가하게 된다. 따라서 요즘같은 글로벌 환경에는 서블릿 홀로 담당하는 올인원 방식이 적합하지 않다.
시스템 변경이 잦은 상황에서 유지 보수를 보다 쉽게 하기 위해서는 중복 코드의 작성을 최소화하고 코드 변경이 쉬워야 한다. 이를 위해 기존 코드의 재사용성을 높이는 방향으로 설계를 해야했고 특히 객체지향의 특성을 활용하여 역할을 세분화하며 역할 간 의존성을 최소화하여 시스템을 개발하려고 하였다. 이런 생각을 반영한 시스템 설계 방식이 바로 MVC 아키텍처 패턴이다.
📌 MVC패턴
MVC 구조에서는 클라이언트의 요청 처리를 서블릿 혼자서 담당하지 않고 세 개의 컴포넌트로 나누어 처리를 한다. 그 세 개의 컴포넌트는 Model, View, Controller이고 MVC란 Model, View, Controller의 약자이다.
Model
MVC패턴에서 실제적인 비즈니스 로직을 실행하는 부분이다.
Model은 비즈니스 로직을 처리하여 얻은 결과를 Controller를 통해 View 페이지로 전달한다. 데이터베이스 작업이 있는 경우 이 작업이 Model 부분에서 이루어진다. 작업 처리 후 그 결과를 View 페이지에서 화면을 만드는데 필요한 데이터가 Controller를 통하여 View로 전달되여 처리된 내용이 화면에 표시된다. 참고로 Model은 일반적인 클래스 파일(POJO)로 이루어져 있다.
View
화면 출력 부분(디자인)을 View라고 한다.
화면 출력을 담당하기 떄문에 JSP 페이지 같은 거로 구성되며, 코드는 거의 디자인에 관한 것으로 이루어져 있다. View에서는 Model의 역할인 데이터베이스 연동과 같은 비즈니스 로직을 절대 구현하지 않으며, Controller를 통하여 Model에서 처리한 결과를 화면에 출력할 때만 사용한다. 즉, View는 단순히 결과를 화면에 보여주는 정도로만 사용 된다.
Controller
Model과 View를 적절하게 연결시켜주는 역할을 한다. (일의 조정자라 할 수 있다.)
Controller은 Servlet으로 구성되어 있는데, Servlet은 초기 진입점이자 뷰와 모델을 연동하는 역할을 하기 때문이다.
Model의 경우 POJO로 이루어져있으므로 외부에서 직접적인 접근을 할 수가 없다. 또한 View에서는 단순히 결과를 화면에 보여주기만 한다. 때문에 Controller는 MVC 패턴에서 이들을 연결해주는 역할을 한다. 그 과정을 간단히 설명하자면, Model에서 비즈니스 로직을 처리하기 위해서 Controller를 통해 Model을 호출하고, 처리가 완료되면 화면에 출력하기 위해 Controller가 Model에서 View로 전달하는 역할을 한다.
💡MVC 이점
Model, View, Controller 이 세 가지의 컴포넌트를 분리하여 디자이너는 Model 부분을 신경쓰지 않고 View 부분만 개발할 수 있고, 프로그래머는 View 부분을 신경 쓰지 않고 Model이나 Controller부분만 집중하여 개발 수 있기 때문에 업무 집중도가 높아져 개발 속도가 빨라진다. 또한 화면을 바꾸거나 데이터 형식을 바꾸더라도 모델 Model 컴포넌트는 그대로 재사용할 수 거나, Model이나 Controller 상관없이 View 교체만으로 UI를 손쉽게 바꿀 수 있는 등 코드 재사용이 용이하고 융통성이 증가하였다.
'JSP & Servlet > 개념' 카테고리의 다른 글
[JSP] EL이란? (Expression Language란?) (0) | 2022.06.18 |
---|---|
JSTL 설치 (0) | 2022.06.18 |
이클립스에서 DB 연동하기 (MySQL) (0) | 2022.06.16 |
[JDBC] 트랜잭션 처리 (0) | 2022.04.24 |
ResultSet과 ResultSetMetaData (feat. 커서 이동 옵션) (0) | 2022.04.24 |