카테고리 없음

Spring MVC

com.oryneogury 2026. 1. 19. 14:31

Spring MVC 구성요소와 동작 원리

Spring MVC는 Spring Framework에서 제공하는 웹 애플리케이션 개발을 위한 MVC(Model-View-Controller) 패턴 기반의 프레임워크다.

Spring MVC란?

Spring MVC는 DispatcherServlet을 중심으로 동작하는 Front Controller 패턴을 사용한다. 클라이언트의 모든 요청을 DispatcherServlet이 받아서 적절한 컨트롤러로 분배하고, 그 결과를 다시 클라이언트에게 응답하는 구조로 되어 있다.

Spring MVC의 핵심 구성요소

1. DispatcherServlet

DispatcherServlet은 Spring MVC의 핵심 구성요소로, Front Controller 역할을 수행한다. 클라이언트로부터 들어오는 모든 HTTP 요청을 가장 먼저 받아서 적절한 핸들러(컨트롤러)에게 요청을 위임하고, 그 결과를 받아 응답을 처리한다.

2. HandlerMapping

HandlerMapping은 클라이언트의 요청 URL을 어떤 컨트롤러가 처리할지 매핑해주는 역할을 한다. DispatcherServlet은 HandlerMapping에게 요청 URL을 전달하면, HandlerMapping은 해당 URL을 처리할 수 있는 적절한 핸들러(컨트롤러 메서드)를 찾아서 반환한다.

3. HandlerAdapter

HandlerAdapter는 HandlerMapping이 찾아준 핸들러를 실제로 실행하는 역할을 한다. 다양한 타입의 핸들러를 동일한 방식으로 실행할 수 있도록 어댑터 패턴을 적용한 것이다. 컨트롤러의 메서드를 호출하고 그 결과를 ModelAndView 형태로 변환한다.

4. Controller

Controller는 실제 비즈니스 로직을 처리하는 컴포넌트다. 클라이언트의 요청을 받아서 Service 계층을 호출하고, 처리 결과를 Model에 담아 View 이름과 함께 반환한다.

@Controller
public class UserController {

    @GetMapping("/users/{id}")
    public String getUser(@PathVariable Long id, Model model) {
        User user = userService.findById(id);
        model.addAttribute("user", user);
        return "userDetail";
    }
}

위 코드에서 @Controller 어노테이션은 해당 클래스가 Spring MVC의 컨트롤러임을 나타낸다. @GetMapping은 HTTP GET 요청을 처리하는 메서드를 지정하고, Model 객체에 데이터를 담아 View로 전달한다.

5. ModelAndView

ModelAndView는 컨트롤러가 처리한 결과 데이터(Model)와 화면 정보(View)를 함께 담는 객체다. Model은 View에 전달할 데이터를 담고 있으며, View는 렌더링할 뷰의 이름을 나타낸다.

6. ViewResolver

ViewResolver는 컨트롤러가 반환한 View 이름을 실제 View 객체로 변환하는 역할을 한다. 예를 들어 컨트롤러가 "userDetail"이라는 문자열을 반환하면, ViewResolver는 이를 "/WEB-INF/views/userDetail.jsp"와 같은 실제 경로로 변환한다.

7. View

View는 클라이언트에게 보여줄 화면을 렌더링하는 역할을 한다. Model에 담긴 데이터를 사용하여 HTML, JSON, XML 등의 형태로 최종 응답을 생성한다.

Spring MVC 동작 흐름

  1. 클라이언트가 HTTP 요청을 보내면 DispatcherServlet이 가장 먼저 요청을 받는다.

  2. DispatcherServlet은 HandlerMapping에게 요청을 처리할 핸들러를 찾아달라고 요청한다.

  3. HandlerMapping은 요청 URL에 매핑된 적절한 Controller를 찾아서 DispatcherServlet에게 반환한다.

  4. DispatcherServlet은 HandlerAdapter에게 찾은 핸들러의 실행을 요청한다.

  5. HandlerAdapter는 실제 Controller의 메서드를 호출하여 비즈니스 로직을 실행한다.

  6. Controller는 Service 계층을 호출하여 비즈니스 로직을 처리하고, 결과 데이터를 Model에 담아 View 이름과 함께 반환한다.

  7. HandlerAdapter는 Controller의 반환값을 ModelAndView 객체로 변환하여 DispatcherServlet에게 전달한다.

  8. DispatcherServlet은 ViewResolver에게 View 이름을 전달하여 실제 View 객체를 얻는다.

  9. ViewResolver는 View 이름을 실제 View 경로로 변환하여 View 객체를 반환한다.

  10. DispatcherServlet은 View 객체에게 Model 데이터를 전달하여 렌더링을 요청한다.

  11. View는 Model 데이터를 사용하여 최종 응답(HTML, JSON 등)을 생성한다.

  12. DispatcherServlet은 생성된 응답을 클라이언트에게 전송한다.

DispatcherServlet의 중요성

DispatcherServlet은 Spring MVC의 중심이 되는 구성요소다. 개발자가 각 요청마다 서블릿을 만들고 web.xml에 등록하는 번거로움 없이, DispatcherServlet 하나만 등록하면 모든 요청을 받아서 적절히 분배할 수 있다. 이는 Front Controller 패턴의 핵심 이점으로, 공통 처리 로직을 한 곳에서 관리할 수 있게 해준다.

Spring MVC의 장점

Spring MVC는 각 구성요소의 역할이 명확하게 분리되어 있어 유지보수가 용이하다. DispatcherServlet이 요청 처리의 흐름을 제어하고, 각 구성요소는 자신의 역할만 충실히 수행하면 된다. 또한 인터페이스 기반으로 설계되어 있어 필요에 따라 구현체를 교체하거나 확장할 수 있는 유연성을 제공한다.