본문 바로가기
to Developer/Spring

MVC 패턴

by EH헌 2024. 1. 26.

팀 프로젝트를 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

  1. 클라이언트(사용자)의 모든 요청은 DispatcherServlet이 받는다.
  2. DispatcherServlet은 hanlderMapping을 통해서 요청에 해당하는 Controller를 실행 시킨다.
  3. Controller는 적절한 서비스 객체를 호출 시킨다.
  4. Service는 DB처리를 위해 DAO를 이용하여 데이터를 요청 한다.
  5. DAO는 mybatis를 이용하는 Mapper를 통해 작업 처리를 한다.
  6. 결과(처리한 데이터)가 mapper->DAO->Service->Controller로 전달된다.
  7. Contorller는 전달된 결과(처리된 데이터)를 View Resolver를 통해전달 받을 View가 있는지 검색한다.
  8. 전달 받은 View가 있다면 View에게 전달된 결과(처리된 데이터)를 전달한다.
  9. View는 전달받은 결과(처리된 데이터)를 다시 DispatcherServlet에게 전달한다.
  10. DispatcherServlet은 전달받은 결과(처리된 데이터)를 클라이언트에게 전달한다.

*Front Controller의 역할은 서버로 들어오는 모든 요청을 받아서 처리.(공통 처리 작업을 먼저 수행 한 후 적절한 세부컨트롤러에게 작업을 위임해주고 예외 발생시 일관된 방식으로 에러를 처리해주는 일을 합니다. 이런 일들을 하기 때문에 각 컨트롤러들 사이의 중복된 코드 문제나협업시 개발자들의 개발 방식이 다른 경우 등을 해결을 할 수 있습니다.)


자료 참고
[참고 1] [참고 2] [참고 3]

'to Developer > Spring' 카테고리의 다른 글

Ajax  (0) 2024.02.14
WAS, Servlet  (0) 2024.02.01
Spring Container, Bean  (0) 2024.01.30
Spring Framework  (1) 2024.01.29
Dispatcher Servlet  (0) 2024.01.26