본문 바로가기
Self Study/Others

Spring 과 Servlet

by Lynnet 2025. 7. 5.
728x90

✅ 핵심 한 줄 요약

Spring은 내부적으로 DispatcherServlet이라는 서블릿을 사용해서 모든 웹 요청을 처리합니다.


🔷 구조적으로 어떻게 되는가?

Spring MVC의 요청 흐름은 다음과 같아요:

 

브라우저 요청
    ↓  (HTTP 요청)
Tomcat (서블릿 컨테이너)
    ↓
DispatcherServlet (Spring이 만든 서블릿)
    ↓
Controller (@Controller or @RestController)
    ↓
Service, Repository 등 비즈니스 로직 처리
    ↓
DispatcherServlet
    ↓
응답 반환
 

🧩 DispatcherServlet이 뭐야?

🔍 DispatcherServlet = Spring이 만든 서블릿

  • HttpServlet을 상속받은 일반적인 서블릿
  • web.xml이나 ServletInitializer에서 /* 모든 요청을 가로채도록 등록됨
  • 그 후 내부에서 어떤 Controller가 이 요청을 처리할지 판단하고 실행함

즉, 서블릿인데 우리가 직접 만들 필요 없이 Spring이 대신 관리해주는 고급 서블릿이에요.

 

Spring 의 경우 web.xml 에 이렇게 등록했어요 : 

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

 


🔧 예: DispatcherServlet 등록 (Spring Boot가 자동으로 해줌)

public class MyWebAppInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext container) {
        AnnotationConfigWebApplicationContext context =
            new AnnotationConfigWebApplicationContext();
        context.setConfigLocation("com.example.config");

        ServletRegistration.Dynamic dispatcher =
            container.addServlet("dispatcher", new DispatcherServlet(context));
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/");
    }
}

※ 이 설정은 이제 Spring Boot에서는 자동으로 해줍니다.


🔄 DispatcherServlet은 어떤 역할을 할까?

DispatcherServlet은 Spring MVC의 "프론트 컨트롤러" 역할을 합니다.
모든 요청을 가로채서 아래와 같은 흐름으로 동작합니다:

  1. 요청 수신 (예: /hello)
  2. 적절한 @Controller 찾기 (@RequestMapping("/hello"))
  3. 서비스/DB 호출 등 로직 실행
  4. 결과를 View 또는 JSON으로 반환
  5. 응답 반환

즉, DispatcherServlet은 직접 doGet(), doPost() 등을 구현하고
그 안에서 Spring Bean(Controller 등)을 찾아 실행합니다.

 


⚙️ 요청 처리 순서 (좀 더 자세히)

  1. 사용자가 /hello에 접속
  2. Tomcat은 이 요청을 서블릿에게 전달
  3. DispatcherServlet이 요청을 가로챔
  4. 등록된 HandlerMapping을 통해 어떤 @Controller가 처리할지 찾음
  5. 그 @Controller의 메서드 실행 (@RequestMapping, @GetMapping 등)
  6. 리턴값(View 또는 JSON 등)을 ViewResolver나 HttpMessageConverter를 통해 변환
  7. 응답 객체에 담아 사용자에게 전송

💡 핵심 클래스 요약

클래스/인터페이스설명
DispatcherServlet 모든 요청을 처리하는 Spring의 핵심 서블릿
HandlerMapping URL에 맞는 컨트롤러 찾기
HandlerAdapter 컨트롤러를 실제로 호출
ViewResolver JSP 등 뷰 이름을 실제 경로로 변환
HttpMessageConverter 객체를 JSON/XML로 바꿔주는 역할 (REST 응답용)
 

📦 DispatcherServlet도 결국 HttpServlet이다!

public class DispatcherServlet extends FrameworkServlet {
    // FrameworkServlet은 HttpServlet을 상속
}

👉 즉, DispatcherServlet도 결국 HttpServlet이기 때문에
Tomcat이 서블릿을 실행하는 구조 그대로 동작합니다.


✅ 요약 정리

질문답변
Spring은 서블릿을 쓰나요? ✅ 내부적으로 DispatcherServlet이라는 서블릿을 씁니다.
누가 실행하나요? Tomcat 같은 서블릿 컨테이너가 실행합니다.
우리는 왜 몰랐을까요? Spring이 복잡한 서블릿 설정을 자동으로 해주기 때문입니다.
DispatcherServlet의 역할은? 요청을 받아서 어떤 Controller가 처리할지 결정하고 응답까지 처리
 
728x90
반응형