[F-Lab 모각코 챌린지] - 17일차 MVC 패턴
F-Lab 모각코 챌린지 17일차 학습 기록입니다 MVC 에 대해 공부하고 MVC1 과 MVC2 의 차이를 정리하였습니다. 그리고 Spring 에서 MVC2 의 Controller 에서 사용하는 Front-Controller 패턴도 함께 정리하였습니다
![[F-Lab 모각코 챌린지] - 17일차 MVC 패턴](/content/images/size/w1200/2023/06/-------_--------_-------11.png)
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)
웹 애플리케이션이 종료될 때 호출
주로 리소스 정리 및 연결 종료등의 작업을 수행