Spring MVC는 수 많은 모듈로 이루어진 Spring Framework의 모듈 중 하나
- Model-View-Controller 패턴
- 관심사 분리를 통해 유지보수성과 확장성을 크게 향상
- 프론트 컨트롤러 패턴과 의존성 주입(DI) 을 결합하여 기존 서블릿 개발의 복잡성을 획기적으로 줄임
Spring MVC 핵심 구성 요소와 동작 원리
1. DispatcherServlet: 모든 요청의 관문
- DispatcherServlet은 Spring MVC의 심장부
- 프론트 컨트롤러 패턴을 구현
- HttpServlet을 상속받아 모든 HTTP 요청을 가장 먼저 받아들이고, 적절한 ControlleR에서 요청을 위힘
특징
- 공통 작업(인코딩, 보안, 로깅 등)을 중앙집중식으로 처리
- Spring Boot에서는 자동으로 등록되어 모든 경로(/*)에 매핑
- 정적 자원(CSS/JS/이미지) 처리를 위한 별도 설정 지원
2. HandlerMapping: 요청과 컨트롤러의 연결 고리
- HandlerMapping은 들어오는 요청 URL을 분석하여 해당 요청을 처리할 수 있는 적절한 컨트롤러를 찾아주는 역할
실무에서 주로 사용되는 구현체
- RequestMappingHandlerMapping
- @RequestMapping 기반의 어노테이션 컨트롤러 매핑
- BeanNameUrlHandlerMapping
- 스프링 빈 이름으로 핸들러 검색
3. HandlerAdapter: 다양한 컨트롤러 실행의 핵심
- HandlerAdapter는 어댑터 패턴을 적용하여 다양한 타입의 컨트롤러를 유연하게 실행할 수 있게 해주는 컴포넌트
- Spring이 여러 세대의 컨트롤러 구현 방식을 모두 지원할 수 있게 해주는 핵심 요소
주요 구현체
- RequestMappingHandlerAdapter
- @Controller 어노테이션 기반 컨트롤러 처리
- HttpRequestHandlerAdapter
- HttpRequestHandler 인터페이스 처리
- SimpleControllerHandlerAdapter
- 전통적인 Controller 인터페이스 처리
4. ViewResolver: 논리적 뷰를 실제 뷰로 변환
- ViewResolver는 컨트롤러가 반환한 논리적 뷰 이름 을 실제 뷰 파일 경로로 변환하는 역할
application.properties 에서 작성
Spring MVC 요청 처리 흐름
전체 처리 과정
- 클라이언트 요청: HTTP 요청이 서버에 도달
- DispatcherServlet 진입: 모든 요청을 중앙 집중 처리
- HandlerMapping 조회: 요청 URL에 매핑되는 컨트롤러 검색
- HandlerAdapter 검색: 찾은 컨트롤러를 실행할 수 있는 어댑터 조회
- 컨트롤러 실행: 비즈니스 로직 처리
- ModelAndView 반환: 처리 결과와 뷰 정보 포함
- ViewResolver 호출: 논리적 뷰 이름을 실제 뷰로 변환
- View 렌더링: 모델 데이터를 이용해 최종 응답 생성
- 클라이언트 응답: 완성된 HTML/JSON을 클라이언트에 전송
계층별 역할 분담
Spring MVC는 레이어드 아키텍쳐와 완벽하게 결합되어 각 계층이 명확한 책임을 가진다.
프레젠테이션 계층 (Presentation Layer)
- DispatcherServlet, Controller, View, ViewResolver가 담당
- 사용자 요청 처리와 응답 생성의 책임
비즈니스 계층 (Business Layer)
- Service 클래스들이 핵심 비즈니스 로직 처리
@Service 어노테이션으로 Spring 컨테이너에 등록
데이터 접근 계층 (Data Access Layer)
- Repository, DAO가 데이터베이스와의 상호작용 담당
@Repository 어노테이션으로 예외 변환과 컴포넌트 스캔 지원
요즘의 Spring MVC @RestController 와 API 개발
전통적 MVC와 REST API의 차이점
@Controller vs @RestController의 핵심 차이점을 이해하는 것은 현대 웹 개발에서 매우 중요
API 개발 시 고려사항
- @RestController를 사용할 때는 ViewResolver 단계를 거치지 않고 HttpMessageConverter를 통해 직접 응답을 생성
- SPA나 모바일 앱과의 연동에서 중요한 패턴