팀 프로젝트를 MVC2 패턴으로 진행했었다.
프로젝트를 진행한 지 오래 되기도 하고 MVC에 대해 다시 정리하고자 포스팅을 한다.
MVC 패턴 (Model - View - Controller)
- Model - 프로그램의 내부 상태, 데이터(정보) 를 뜻함
- View - 사용자 인터페이스, 클라이언트에게 보여지는 화면을 뜻함
- Controller - 데이터와 비즈니스 로직 간의 상호 작용을 뜻함, DB 접근 경우에 따라 Service에 접근
MVC 패턴 장단점
- 정의
- Model, View, Controller로 분리하는 아키텍처
- 장점
- 과거에는 Controller에 다 담아두고 처리했다.
- 기능 별로 코드를 분리하여, 가독성을 높이고 재사용성을 증가시킨다.
- 단점
- view와 model 사이에 의존성이 높아서 애플리케이션이 커질수록 복잡해지고 유지보수가 어렵다.
- 대규모의 프로그램에서 Controller에 다수의 Model과 View가 복잡하게 연결되어 코드 분석과 테스트가 어려워 질 수 있다.
- 이런 의존성 문제를 해결하기 위해 MVVM, MVP 구조가 등장했다.
어떻게 하나의 컨트롤러로 여러 요청을 받을까?
컨트롤러는 기본적으로 컴포넌트 스캔되면서 스프링 빈 컨테이너에 올라가있고 싱글톤 패턴으로 구현되어있기 때문에 여러 스레드의 요청이 들어와도 하나의 컨트롤러 객체를 공유하면서 처리한다.
여기서 주의할 점은 싱글톤 패턴으로 구현되어 있어 있다는 것은 Thread-Safe하지 않다는 의미이므로 상태를 공유하거나 저장하는 코드가 없도록 Stateless하게 정의해야 한다.
결과적으로 내부에는 상태가 존재하지 않으니 메서드에 대한 정보만 같이 공유해서 쓰는 것이다.
MVC 1
MVC1 패턴의 경우 View와 Controller를 모두 JSP가 담당하는 형태를 가진다. 즉 JSP 하나로 유저의 요청을 받고 응답을 처리하므로 구현 난이도는 쉽다.
단순한 프로젝트에는 괜찮겠지만 내용이 복잡하고 거대해질수록 이 패턴은 힘을 잃는다. JSP 하나에서 MVC 가 모두 이루어지다보니 재사용성도 매우 떨어지고, 읽기도 힘들어진다. 즉 유지보수에 있어서 문제가 발생.
MVC 2
MVC2 패턴은 널리 표준으로 사용되는 패턴으로 요청을 하나의 컨트롤러(Servlet)가 먼저 받는다. 즉 MVC1과는 다르게 Controller, View가 분리되어 있다. 따라서 역할이 분리되어 MVC1패턴에서의 단점을 보완할 수 있다. 그러므로 개발자는 M, V, C 중에서 수정해야 할 부분이 있다면, 그것만 꺼내어 수정하면 돼서 유지보수에 있어서도 큰 이점을 가진다.
MV2는 MVC1 패턴보다 구조가 복잡해질 수 있지만, 개발자가 이러한 세부적인 구성까지 신경쓰지 않을 수 있도록 각종 프레임워크들이 지금까지 잘 발전되어 왔다. 그 중에서 대표적인 것이 바로 스프링 프레임워크.
Spring Framework MVC 2
- 클라이언트(사용자)의 모든 요청은 DispatcherServlet이 받는다.
- DispatcherServlet은 hanlderMapping을 통해서 요청에 해당하는 Controller를 실행 시킨다.
- Controller는 적절한 서비스 객체를 호출 시킨다.
- Service는 DB처리를 위해 DAO를 이용하여 데이터를 요청 한다.
- DAO는 mybatis를 이용하는 Mapper를 통해 작업 처리를 한다.
- 결과(처리한 데이터)가 mapper->DAO->Service->Controller로 전달된다.
- Contorller는 전달된 결과(처리된 데이터)를 View Resolver를 통해전달 받을 View가 있는지 검색한다.
- 전달 받은 View가 있다면 View에게 전달된 결과(처리된 데이터)를 전달한다.
- View는 전달받은 결과(처리된 데이터)를 다시 DispatcherServlet에게 전달한다.
- DispatcherServlet은 전달받은 결과(처리된 데이터)를 클라이언트에게 전달한다.
*Front Controller의 역할은 서버로 들어오는 모든 요청을 받아서 처리.(공통 처리 작업을 먼저 수행 한 후 적절한 세부컨트롤러에게 작업을 위임해주고 예외 발생시 일관된 방식으로 에러를 처리해주는 일을 합니다. 이런 일들을 하기 때문에 각 컨트롤러들 사이의 중복된 코드 문제나협업시 개발자들의 개발 방식이 다른 경우 등을 해결을 할 수 있습니다.)