[F-Lab 모각코 챌린지] - 17일차 MVC 패턴

F-Lab 모각코 챌린지 17일차 학습 기록입니다 MVC 에 대해 공부하고 MVC1 과 MVC2 의 차이를 정리하였습니다. 그리고 Spring 에서 MVC2 의 Controller 에서 사용하는 Front-Controller 패턴도 함께 정리하였습니다

[F-Lab 모각코 챌린지] - 17일차 MVC 패턴

MVC 패턴

Model-View-Controller 의 약자

  • Model
    비즈니스 로직, 데이터, 규칙을 정의하고 처리
  • View
    사용자에게 보여지는 인터페이스 담당
  • Controller
    사용자의 요청을 처리

Spring MVC 기준 설명

  • Model
    사용자가 구현하는 @Service, @Repository 가 해당된다
    객체지향 패러다임이나 사상을 적용하여 POJO 로 작성되기도 하며 웹 애플리케이션에서 핵심적인 비즈니스를 담당한다
  • View
    JSP, Thymeleaf, FreeMarker 등의 템플릿 엔진을 사용하여 View 를 구성한다
    이 부분에서 MVC1 과 2의 차이가 생기는데, 바로 다음에서 내용을 확인해보면 알 수 있다
  • Controller
    사용자가 구현하는 @Controller 가 해당된다
    현재의 스프링에서는 Front-Controller 패턴을 적용하여 DispatcherServlet 이 사용자의 요청에 대해 매핑된 컴포넌트(Controller) 를 실행하여 처리 해 주고 있는데, Front-Controller 는 후술.

MVC & MVC2

위에서 설명한 MVC 에 대한 내용은 둘 다 동일하게 적용한다

하지만 일부 다른점이 존재한다

  • 구조 개념
    MVC1 은 Smalltalk 프로그래밍 언어를 위해 만들어진 패턴이기 때문에 일반적으로 데스크톱 애플리케이션에 적합한 구조를 취한다
  • View 가 직접 처리
    View 가 사용자 입력에 직접적으로 반응하며 요청에 따라 Model 을 업데이트 하는 구조를 취하고 있기 때문에 View 와 Model 간 의존성이 강하게 엮인다. 따라서 대부분의 View 로직은 Model 로직을 포함하고 있으며 View 가 변경되면 Model 역시 변경되어야 한다. 이 차이 때문에 재사용성을 강조하는 웹 어플리케이션에서는 MVC1 이 적합하지 않을 수 있다

이 외에도 여러가지 차이점이 존재한다.

기준 MVC1 MVC2
요청 컨트롤 컴포넌트 뷰(View) 컨트롤러(Controller)
사용자 요청 처리 뷰가 직접 처리 컨트롤러가 처리
적용 분야 초기 웹 애플리케이션, 데스크톱 애플리케이션 현대적인 웹 애플리케이션
뷰의 역할 사용자 입력을 직접 처리하고 로직을 수행 주로 데이터를 표시하는데 집중
컨트롤러의 역할 뷰와 모델 사이의 연결 역할 사용자 요청을 처리하고, 모델과 상호작용, 뷰 선택
복잡성 애플리케이션의 규모가 커질수록 복잡해짐 더 명확한 역할 구분으로 관리 및 확장성이 용이
유지 보수 상대적으로 어려움 명확한 구조로 인해 유지 보수가 더 쉬움

Front-Controller 패턴

  • 디자인 패턴중 하나
  • 중앙 처리 컴포넌트가 존재하여 사용자의 요청에 대해 처리되어야 할 여러 컴포넌트들에게 요청을 라우팅 해주는 역할을 수행한다
    (DispatcherServlet)
  • 다양한 요청에 대한 패턴 매핑이 존재하며 개발자는 이러한 패턴의 매핑을 @Controller 라는 애노테이션으로 간단하게 처리 할 수 있다

내부에서는 여러 디자인 패턴을 이용하여 사용자의 요청에 대한 패턴 매칭을 진행 할 수 있다

Spring 내부에서는 ViewResolver, HandlerMapping 을 관리하고 패턴매칭을 통해 요청을 수행할 수 있도록 전략패턴을 사용하고 있다.

ServletContextListener

  • 애플리케이션의 생명주기에 대한 이벤트 모니터링을 수행하는 인터페이스
  • 웹 애플리케이션의 시작과 종료 시점에 특정 코드를 실행하도록 설정하는 데 사용

내부에는 두개의 메서드가 존재

  • contextInitialized(ServletContextEvent sce)
    웹 애플리케이션이 시작할 때 호출됨
    주로 DB 연결, 캐시 초기화, 외부 리소스 로딩과 같은 초기화를 진행
  • contextDestroyed(ServletContextEvent sce)
    웹 애플리케이션이 종료될 때 호출
    주로 리소스 정리 및 연결 종료등의 작업을 수행