BE/Spring & Spring Boot

[Spring Boot] DispatcherServlet

baek-dev 2025. 3. 7. 18:53

⚡ 1. DispatcherServlet이란?

DispatcherServletSpring MVC의 핵심 컨트롤러(Front Controller) 역할을 하는 서블릿입니다.

클라이언트 요청을 받아 적절한 컨트롤러로 전달하고, 응답을 처리하는 역할을 합니다.

 

📌 쉽게 말하면?

요청을 받고 → 컨트롤러에 전달 → 응답을 반환하는 중앙 컨트롤러

Front Controller 패턴을 사용하여 모든 요청을 한 곳에서 처리

Spring MVC에서 HTTP 요청을 처리하는 핵심 역할 수행

사용자 → DispatcherServlet → 컨트롤러 → 서비스 → 리포지토리 → DB
                ↓
             ViewResolver
                ↓
             응답 반환

 

⚡ 2. DispatcherServlet의 동작 과정

🏗 DispatcherServlet 요청 처리 과정

 

1️⃣ 클라이언트가 요청을 보냄 (/user)

2️⃣ DispatcherServlet이 요청을 가로챔

3️⃣ HandlerMapping을 통해 해당 요청을 처리할 컨트롤러를 찾음

4️⃣ 컨트롤러(Controller)가 요청을 처리하고 결과를 반환

5️⃣ ViewResolver가 뷰(View)를 찾아 HTML을 생성

6️⃣ DispatcherServlet이 최종적으로 클라이언트에게 응답 반환

 

⚡ 3. DispatcherServlet의 내부 동작

✅ DispatcherServlet의 주요 구성 요소

구성 요소 역할
HandlerMapping 요청 URL에 맞는 컨트롤러 찾기
HandlerAdapter 컨트롤러를 실행하는 인터페이스
Controller 비즈니스 로직 수행
ViewResolver 응답할 뷰(View)를 찾음
ModelAndView 컨트롤러가 반환하는 데이터와 뷰 정보
View 최종적으로 클라이언트에게 렌더링되는 HTML

 

🏗 DispatcherServlet 내부 구조

사용자 요청
     ↓
[ DispatcherServlet ]
     ↓
[ HandlerMapping ] - 어떤 컨트롤러를 실행할지 결정
     ↓
[ HandlerAdapter ] - 컨트롤러 실행
     ↓
[ Controller ] - 비즈니스 로직 실행
     ↓
[ ModelAndView ] - 데이터와 뷰 정보 반환
     ↓
[ ViewResolver ] - 뷰 찾기
     ↓
[ View ] - 최종 HTML 생성
     ↓
사용자 응답

 

⚡ 4. DispatcherServlet 동작 예제

✅ 1) 컨트롤러 예제

@RestController
@RequestMapping("/user")
public class UserController {

    @GetMapping
    public String getUser() {
        return "Spring User";
    }
}

📌 설명

/user로 요청하면 DispatcherServlet이 요청을 가로채어 UserController에 전달

UserController"Spring User" 를 응답

 

✅ 2) ViewResolver를 통한 JSP 응답 예제

@Controller
@RequestMapping("/view")
public class ViewController {

    @GetMapping
    public String showView(Model model) {
        model.addAttribute("message", "Hello, Spring!");
        return "hello"; // ViewResolver가 `hello.jsp`를 찾음
    }
}
<!-- /WEB-INF/views/hello.jsp -->
<html>
<body>
    <h1>${message}</h1>
</body>
</html>

📌 설명

/view로 요청 시 DispatcherServlet이 ViewController 실행

ViewResolver가 hello.jsp를 찾아서 렌더링

최종적으로 "Hello, Spring!" 이 포함된 HTML 응답 반환

 

⚡ 5. DispatcherServlet 설정 및 커스텀

✅ 1) DispatcherServlet 기본 설정

 

Spring Boot에서는 DispatcherServlet이 자동으로 설정되므로 별도 설정이 필요 없음.

@Bean
public DispatcherServlet dispatcherServlet() {
    return new DispatcherServlet();
}

 

✅ 2) DispatcherServlet URL 패턴 변경

 

기본적으로 모든 요청을 처리하지만 특정 패턴만 처리하도록 변경할 수 있음.

# application.properties
server.servlet.context-path=/app
server.servlet.path=/api/*

📌 설명

server.servlet.context-path=/app/app 경로를 기본 URL로 설정

server.servlet.path=/api/*/api/로 시작하는 요청만 처리

 

⚡ 6. DispatcherServlet이 제공하는 주요 기능

✅ 1) 요청 매핑 (HandlerMapping)

@RestController
@RequestMapping("/user")
public class UserController {

    @GetMapping("/{id}")
    public String getUser(@PathVariable String id) {
        return "User ID: " + id;
    }
}

📌 설명

@RequestMapping 을 통해 /user/{id} 요청을 매핑

DispatcherServlet이 적절한 컨트롤러를 실행

 

✅ 2) 요청 데이터 바인딩

@RestController
@RequestMapping("/form")
public class FormController {

    @PostMapping
    public String submitForm(@RequestParam String name) {
        return "Received: " + name;
    }
}

📌 설명

@RequestParam 을 사용하여 클라이언트의 폼 데이터를 받음

DispatcherServlet이 요청 데이터를 컨트롤러로 전달

 

✅ 3) JSON 응답 처리

@RestController
@RequestMapping("/json")
public class JsonController {

    @GetMapping
    public User getUser() {
        return new User("Spring", 25);
    }
}

📌 설명

@RestController 는 자동으로 JSON 형식으로 응답 반환

DispatcherServlet이 Jackson 라이브러리를 사용하여 JSON 변환

 

⚡ 7. DispatcherServlet과 필터(Filter) & 인터셉터(Interceptor)

✅ 1) 필터 (Filter)

 

DispatcherServlet 앞에서 요청을 가로채어 처리하는 역할

@WebFilter(urlPatterns = "/*")
public class CustomFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        System.out.println("필터 실행!");
        chain.doFilter(request, response);
    }
}

📌 설명

모든 요청(/*)에 대해 필터 적용

DispatcherServlet이 실행되기 전에 요청을 가로챔

 

✅ 2) 인터셉터 (Interceptor)

 

DispatcherServlet 이후 컨트롤러 실행 전/후에 동작하는 역할

public class CustomInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        System.out.println("인터셉터 실행!");
        return true;
    }
}

📌 설명

컨트롤러 실행 전(preHandle)에 동작

DispatcherServlet이 컨트롤러를 실행하기 전에 요청을 가로챔

 

⚡ 결론

DispatcherServlet은 Spring MVC의 Front Controller 역할을 수행

요청을 받아 컨트롤러에 전달하고, 뷰를 렌더링하여 응답 반환

HandlerMapping, HandlerAdapter, ViewResolver를 활용하여 요청을 처리

필터(Filter)와 인터셉터(Interceptor)와 함께 요청을 관리 가능

Spring Boot에서는 DispatcherServlet이 자동으로 설정됨

 

🚀 Spring MVC의 핵심 개념인 DispatcherServlet을 이해하면 웹 요청의 흐름을 쉽게 파악할 수 있다

 

 

 

 

출처 : ChatGPT