⚡ 1. DispatcherServlet이란?
DispatcherServlet 은 Spring 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
'BE > Spring & Spring Boot' 카테고리의 다른 글
[Spring Boot] 스프링의 생성자 주입 (0) | 2025.03.19 |
---|---|
[Spring Boot] Spring AI (0) | 2025.03.13 |
[Spring Boot] 스프링 배치 (Spring Batch) (0) | 2025.03.01 |
[Spring Boot] 멀티 모듈 프로젝트 (0) | 2025.02.26 |
[Spring Boot] @TestMethodOrder (0) | 2025.02.25 |