Spring MVC 아키텍처 패턴 정리

민준·2025년 3월 15일
post-thumbnail

Spring은 MVC(Model-View-Controller) 아키텍처를 기반으로 동작하는 웹 프레임워크
→ 사용자의 요청을 처리하고 응답을 반환하는 과정을 구조적으로 관리 가능


1. Spring의 두 가지 아키텍처 패턴

Spring은 크게 두 가지 아키텍처 패턴이 있음.

  • MVC 아키텍처 패턴 → 클라이언트 요청 처리 및 응답 반환
  • 3계층 아키텍처 패턴 → 비즈니스 로직과 데이터 접근 계층 분리

2. MVC 아키텍처 패턴 개요

MVC란?

MVC(Model-View-Controller) 아키텍처는 웹 애플리케이션에서 역할을 분리하여 관리하는 패턴

Spring MVC 흐름

  1. 클라이언트 요청 (브라우저 → 서버)
  2. Front Controller (DispatcherServlet) 요청을 가로챔
  3. 적절한 Controller 호출
  4. Controller는 필요한 데이터를 Model에 담아 View로 전달
  5. ViewResolver가 적절한 뷰 템플릿을 찾아 렌더링
  6. 최종 결과를 클라이언트에게 응답

2.1. Spring MVC 동작 방식

1). Front Controller 패턴이란?

과거 Java EE 시절 (Servlet 기반)에는 각 URL마다 개별 Servlet을 등록해야 했습니다.
Spring에서는 단일 Servlet (DispatcherServlet)이 모든 요청을 처리하도록 개선되었습니다.

Front Controller 이전 (Java EE 시절)

java는 거대 웹 어플리케이션 프로젝트를 위해 Java EE라는 Java 웹 표준 기술을 만들었다.

  • Java 의 웹 표준 중 Java 기반 CGI 프로그램 표준인 Servlet + JSP 등장
  • 당시 Java EE 표준 상에서 Servelt 은 URL 마다 할당되어 개발되었다.
    • GET /helloHelloGetServlet
    • POST /helloHelloPostServlet
    • DELETE /worldWorldDeleteServlet

Front Controller 적용 (Spring MVC)

Spring 에서는 Servlet 을 URL 마다 정의하지 않고, 단일 Serlvet 만을 사용

  • GET /helloDispatcherServletHelloGetController
  • POST /helloDispatcherServletHelloPostController
  • DELETE /worldDispatcherServletWorldDeleteController

즉, DispatcherServlet이 중앙에서 모든 요청을 받아 처리!


2). Spring MVC 요청 처리 흐름

2-0. EC2 서버에서 Tomcat이 처음 구동될때 2개의 Container가 생성

  • Servlet Container (ServletContext) : Tomcat 이 처음 구동 시, 가장 먼저 ServletContext 생성

    • 다음 ServletContextListener 이 실행되어 아래 Spring Container(ApplicationContext) 생성
  • Spring Container (ApplicationContext) : 실제로는 2개의 계층으로 이뤄져있다.

    • Servlet WebApplicationContext : Servlet 에서만 사용하는 Bean - @Controller, HandlerMapping, ViewResolver 등

      쉬운 이해를 위해 Presentation Layer : Spring MVC 로직에 해당하는 객체들

      • 구 servlet-context.xml
    • Root WebApplicationContext : 인프라, 비니니스 공통 Bean - @Service, @Repository, @Compoentn, @Configuration

      쉬운 이해를 위해 Business Layer, Data Access Layer

      • 구 root-context.xml

2-1. 클라이언트 요청이 들어오면?

  • Tomcat이 실행 중이라면 정적 파일(HTML, CSS, JS)이 있는지 먼저 확인
  • 정적페이지가 없다면 DispatcherServlet이 요청을 받음

2-2. DispatcherServlet 역할

  • HandlerMapping (중앙관리) → URL에 맞는 Controller Bean 찾기
  • HandlerAdapter (중앙처리) → 찾은 Controller Bean 호출에 대한 실행을 위임
    • Controller Bean은 결과로 Model 과 View 이름을 반환

2-3. Controller가 요청을 처리하고 Model 혹은 View 이름(String) 반환

@RequestMapping(method = RequestMethod.GET, value = "/")
public String index(Model model) {
    model.addAttribute("name", "Aaron");
    model.addAttribute("age", 10);
    return "index.html"; // View 이름 반환
}

2-4. ViewResolver가 View를 렌더링

  • ViewResolver (중앙관리) → Controller가 반환한 View 템플릿 파일 찾기
  • View (중앙처리) → Model 데이터를 Template와 합쳐 View를 렌더링
    • Thymeleaf : 현재 Spring 표준 Server-side Template Engine
    • Client-side Template Engine : React, Vue 등

2-5. 최종 HTML이 클라이언트에게 반환됨


4. Spring MVC의 주요 구성 요소

구성 요소역할
DispatcherServlet모든 요청을 받아서 적절한 Controller로 전달
HandlerMappingURL과 매칭되는 Controller 검색
HandlerAdapter적절한 Controller 실행
Controller요청을 받아 필요한 데이터(Model)와 View 이름 반환
ModelController에서 View로 전달할 데이터 저장
ViewResolverView 이름을 실제 템플릿 파일로 매핑
ViewModel 데이터를 기반으로 최종 HTML 생성

5. Spring MVC vs. 기존 Servlet 비교

특징기존 Servlet 방식 (Java EE)Spring MVC 방식
요청 처리URL마다 개별 Servlet 등록단일 DispatcherServlet으로 관리
유지보수Servlet이 많아질수록 복잡Controller 단위로 정리 가능
뷰 처리JSP와 Servlet에서 직접 데이터 처리ViewResolver를 통한 템플릿 관리
응답 방식HTML, JSON 모두 직접 처리@ResponseBody 또는 ViewResolver 활용

즉, Spring MVC는 구조적인 요청/응답 처리를 위해 Front Controller를 활용하여 효율성을 극대화함!

0개의 댓글