[Spring] MVC패턴 | Model, Controller, View, MVC1 vs MVC2 vs SpringMVC 비교

dyomi·2024년 7월 26일

MVC 패턴이란, 모델, 뷰, 컨트롤러 3가지 구성요소로 구분해서 개발하는 아키텍쳐 패턴이다.

구성요소

Model

모델은 애플리케이션의 데이터와 비즈니스 로직을 관리하며, 데이터베이스와 상호작용하고 데이터 상태를 정의하며 비즈니스 규칙을 처리한다.(데이터베이스의 레코드를 표현하는 클래스 -> 엔티티 클래스, 도메인 객체, 데이터 처리를 위한 함수 등)

View

뷰는 사용자에게 데이터를 시각적으로 표현하는 부분으로 모델로부터 데이터를 받아 사용자에게 출력하며, 사용자의 입력을 받을 수도 있다.(HTML, CSS, Javascript로 작성된 웹 페이지)

Controller

컨트롤러는 사용자의 입력을 처리하고 모델과 뷰 사이에서 중재 역할을 수행한다. 사용자의 요청을 받아 모델을 업데이트 하고 업데이트된 모델을 뷰에 반영한다. (HTTP요청을 처리하고 응답 생성하는 서블릿)

동작 흐름

  1. 사용자가 웹 브라우저를 통해 특정 URL로 요청을 보낸다.
  2. 컨트롤러가 이 요청을 받아서 요청을 분석하고, 필요한 경우 모델을 호출해서 데이터 조회하거나 수정 로직을 수행한다.
  3. 모델은 비즈니스 로직을 수행하며 요청에 맞는 데이터를 반환한다.
  4. 컨트롤러는 모델로부터 받은 데이터를 바탕으로 뷰를 선택하고 데이터를 뷰에 전달한다.
  5. 뷰는 컨트롤러로부터 받은 데이터를 기반으로 사용자에게 보여질 화면을 생성한다.
  6. 생성된 화면이 사용자에게 응답으로 전송된다.

장점

각 구성요소가 독립적으로 관리돼서 코드의 유지보수가 용이해지고 변경 사항이 다른 구성요소에 미치는 영향을 최소화할 수 있다.

MVC1

JSP가 모델, 뷰, 컨트롤러의 역할을 모두 담당한다.
구현은 쉽고 빠르지만, 비즈니스 로직과 프레젠테이션 로직이 섞여있어 코드의 가독성이 떨어지고 유지보수가 힘들다.

MVC2

서블릿과 JSP를 분리해서 각각의 역할을 명확하게 나눈 패턴으로, 서블릿이 컨트롤러로서 요청을 처리하고 JSP가 뷰를 담당한다.

동작 흐름을 보면 웹 브라우저 요청을 하나의 서블릿이 받고 (컨트롤러), 서블릿은 웹 브라우저의 요청을 알맞게 처리한 뒤 그 결과를 JSP 페이지로 포워딩 시킨다.

Spring MVC

스프링 프레임워크의 일부로 애노테이션 기반으로 컨트롤러, 서비스, 리포지토리 등을 정의할 수 있다. 또한 DI, AOP, 트랜잭션 처리 등 여러 기능을 제공한다.

Spring MVC 동작 흐름

  1. 특정 URL로 요청을 한다.
  2. dispatcherServlet이 요청을 받아서 핸들러 매핑을 통해 요청 URL에 맞는 컨트롤러를 찾는다.
  3. 컨트롤러 매핑 후 requestMapping 애노테이션으로 요청을 처리할 메서드를 찾는다.
  4. 비즈니스 로직 처리를 위한 서비스를 호출한다. (비즈니스 로직 수행, DAO를 통해 데이터베이스와 상호작용)
  5. 비즈니스 로직 처리 후 받은 데이터를 컨트롤러에 전달
  6. 컨트롤러가 모델에 데이터를 추가하고 뷰 이름을 반환한다.
  7. dispatcherServlet이 viewResolver를 사용해 뷰를 찾는다.
  8. 뷰를 렌더링 한다.
  9. 클라이언트에게 렌더링된 뷰를 응답으로 전송한다.


🌟 추가 질문

📍 일반 서블릿에서는 web.xml에 서블릿 매핑이 구성되어 있다면, Spring MVC에서는 어떻게 URL에 맞는 컨트롤러를 찾아갈까?

스프링 MVC에서 DispatcherServlet은 모든 요청을 중앙에서 처리하는 프론트 컨트롤러 역할을 한다. 클라이언트로부터 들어오는 모든 요청은 먼저 DispatcherServlet으로 전달되며, 이는 핸들러 매핑(HandlerMapping)을 통해 적절한 컨트롤러를 찾는다. 이 과정에서 스프링은 애노테이션(@Controller, @RequestMapping 등)을 기반으로 컨트롤러 메서드를 매핑한다. 그 결과, DispatcherServlet은 요청을 처리하고, 필요한 모델 데이터를 준비하여, 적절한 뷰로 응답을 생성한다.


📍 만약 수 백개의 URL이 있을 경우, 어떤 URL이 누가 처리하는지, 어떤 클래스가 담당하는지를 알려면 web.xml과 애노테이션 기반 중 어느 것이 더 찾기 빠를까?
전체적인 구조를 한눈에 파악해야 한다면, web.xml이 더 유리할 수 있다.
web.xml은 중앙 집중 관리 방식으로 한 파일에 모든 URL 매핑이 명시되어 있기 때문에 전체 구조를 한눈에 볼 수 있다.



참고 자료
[Spring] MVC패턴 MVC1 , MVC2 , SpringMVC 차이점과 구조

profile
기록하는 습관

0개의 댓글