Spring

스프링 MVC

정재익 2026. 1. 4. 18:58
제미나이가 그려줬다 댑악!



MVC는 애플리케이션 설계 패턴이다.
Model =  데이터
View  = 화면
Controller =  요청 처리
을 뜻한다.
 
과거에는 웹 애플리케이션에는 MVC의 역할이 분리되지 않았다. 예를들면 자바의 서블릿이 있다. 그러나 웹 서비스가 복잡해 지면서 로직과 UI가 뒤섞인 서블릿만으로는 코드 가독성과 유지 보수의 어려워졌고 웹 애플리케이션에 MVC패턴을 도입하자는 의견이 생겨났다.
 
그리하여 JSP같은 템플릿엔진이 등장했고 JSP가 View, 비즈니스 데이터를 표현하는 도메인 객체가 Model, 서블릿이 Controller를 담당하게 되었다. 그러나 여전히 서블릿의 컨트롤러에는 요청 처리 뿐만아니라 비즈니스 로직도 함께 녹아있다는 한계가 있었다.
 
스프링 MVC는 프론트 컨트롤러 패턴을 사용하여 이 문제를 해결했다. 프론트 컨트롤러 패턴이 없던 시절 각 컨트롤러마다 서블릿이 존재했고 각각의 서블릿이 요청을 받았다. 프론트 컨트롤러란 서블릿을 상속받아 요청에 맞게 각 컨트롤러에 나눠주는 최초 요청이 모이는 중앙지점 역할을 한다. 서블릿은 요청 처리만을 하는 현대적인 Controller(요청 처리) 역할만 하고 비즈니스 로직은 서블릿을 상속하지 않는 독립적인 컨트롤러 내부에서 서비스 계층을 호출하여 처리하게 된 것이다. 또한 스프링 MVC는 누구나 어노테이션 만으로 MVC 패턴을 쉽게 적용할 수 있게 하였다.
 
조금 헷갈릴 수 있는데 MVC의 C의 컨트롤러와 컨트롤러 계층은 의미가 조금 다르다. MVC의 C는 흐름제어를 뜻하는 역할의 개념이고 서블릿이 Controller의 역할을 했다는 뜻이다. 또한 서블릿을 상속하지 않는 독립적인 컨트롤러 내부의 컨트롤러는 아키텍처의 계층 관점의 컨트롤러를 의미한다.
 
이 프론트 컨트롤러는 스프링에서 Dispatcher 서블릿이라고 불린다. Dispatcher 서블릿은 요청을 컨트롤러에 분배해주는 역할 뿐만 아니라 다양한 역할을 한다.
 
요청이 들어오면 서블릿의 service()가 호출된다. 스프링 MVC의 디스패처 서블릿은 이 service() 메서드를 오버라이드 한다.
service() 메서드가 호출되면 디스패처 서블릿의 doDispatch() 메서드가 호출된다. 이 메서드는 아래와 같은 역할을 한다.
 
1. 핸들러 매핑에서 핸들러를 조회한다. (들어온 요청의 URL에 맞는 컨트롤러를 찾는 것이다. 단, 스프링은 URI만 활용하지않고 HTTP 헤더, 컨텐츠타입등 많은 것을 활용한다)
2. 핸들러 어댑터 목록에서 핸들러 어댑터를 조회한다. (그 컨트롤러를 실행할 수 있는 어댑터를 찾는 것이다.)
3. 핸들러 어댑터를 통해 핸들러를 실행한다. (비즈니스 로직을 실행한다.)
4. ModelAndView를 반환받는다. (실행의 결과를 반환받는다.)
5. 뷰리졸버를 실행한다. (뷰의 이름으로 작성할 JSP를 찾는다, 논리 이름을 )
6. 뷰를 반환받는다 (타겟 JSP를 반환받는다.)
7. 뷰에 모델을 렌더링한다. (JSP에 동적 데이터를 렌더링한다.)
8. 뷰를 사용자에게 응답한다.
 

핸들러 매핑

스프링 부트에서는 자동 등록 해주는 핸들러 매핑이 있다. 여러가지가 있지만
0번 우선순위는 @RequestMapping을 사용했을 때 등록하는 어노테이션 기반 매핑
1번 우선순위는 스프링 빈의 이름으로 핸들러를 찾는다.
 

핸들러 어댑터

0번 우선순위 @RequestMapping을 사용했을 때 등록하는 어노테이션 기반 매핑
1번 우선순위 HttpRequestHandler 처리
2번 우선순위 Controller 인터페이스를 구현한 핸들러의 처리(주로 과거에 사용)
 

스프링부트의 뷰 리졸버

0번 우선순위 빈 이름으로 뷰를 찾아서 반환한다
1번 JSP를 처리할 수 있는 뷰를 반환한다.
 
설정정보를 가져와서 빈으로 만들어준다

spring:
  application:
    name: spring-mvc1
  mvc:
    view:
      prefix: /WEB-INF/views/
      suffix: .jsp

예를들면 이런코드를

@Bean
ViewResolver internalResourceViewResolver() {
    return new InternalResourceViewResolver("/WEB-INF/views/", ".jsp");
}

이렇게 자동으로 만들어 줌

'Spring' 카테고리의 다른 글

RestController vs Controller  (0) 2026.01.08
스프링 애노테이션  (0) 2026.01.05
의존관계 검색  (0) 2025.12.21
싱글톤 레지스트리  (1) 2025.12.21
컨테이너, IOC 컨테이너  (0) 2025.12.21