독서하는 개발자's Blog

반응형

🌐 서버 구동 시 전체 흐름

1️⃣ .java → .class 변환 (빌드 단계)

  • 이건 서버 구동 전에 일어납니다.
    javac 또는 IDE/빌드도구(Gradle, Maven 등)가 소스(.java)를 컴파일해서 .class 파일을 만듭니다.
  • 서버가 실행할 때는 이미 컴파일된 .class 파일만 읽습니다.

2️⃣ 서버가 WAR / 클래스 로딩

  • WAS(Tomcat, Jeus, WebLogic 등)가 시작되면,
    /WEB-INF/classes와 /WEB-INF/lib 내부의 .class와 .jar들을 클래스 로더가 읽습니다.
  • 이 시점에서는 아직 Spring이 동작하지 않습니다.

3️⃣ web.xml 해석

  • WAS는 web.xml을 읽고, 설정된 리스너(listener), 필터(filter), 서블릿(servlet)을 순서대로 초기화합니다.

예시:

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>


4️⃣ ContextLoaderListener 실행

  • ContextLoaderListener가 실행되면서 루트 ApplicationContext를 생성합니다.
    (context-param으로 지정한 applicationContext.xml 또는 Java Config 파일을 읽음)

5️⃣ DispatcherServlet 초기화

  • DispatcherServlet이 초기화되면서 자신만의 서블릿 전용 ApplicationContext를 생성합니다.
  • 이때 servlet-context.xml 또는 @Configuration 클래스가 읽히고,
    내부의 <context:component-scan> 설정이 수행됩니다.

6️⃣ Component Scan 수행

  • <context:component-scan>이나 @ComponentScan 설정에 따라,
    지정된 패키지 하위의 클래스 중
    @Component, @Service, @Repository, @Controller 등이 붙은 클래스가 빈으로 등록됩니다.
  • 이때 빈의 의존관계(@Autowired)도 함께 주입됩니다.

7️⃣ DispatcherServlet 준비 완료

  • 이후 요청이 들어오면 DispatcherServlet이 해당 요청을 받아
    HandlerMapping → Controller → ViewResolver 순서로 요청을 처리하게 됩니다.

🔁 정리 요약 순서

순서단계설명
1 .java → .class 빌드 시 컴파일
2 클래스 로딩 WAS가 클래스패스 로드
3 web.xml 파싱 리스너/서블릿 등록
4 ContextLoaderListener 루트 컨텍스트 생성
5 DispatcherServlet 서블릿 컨텍스트 생성
6 component-scan @Component, @Service 등 읽어서 Bean 등록
7 요청 처리 DispatcherServlet이 요청 매핑 처리

원래 질문의 표현대로 하면 이렇게 보정할 수 있습니다 👇

java → class 파일 변환
→ class 파일 로딩
→ web.xml 해석 → DispatcherServlet 초기화
→ component-scan 실행 → @Component 들이 Bean 으로 등록
맞습니다. (단, web.xml의 DispatcherServlet이 “있으면”이 아니라, 그것이 “초기화될 때” component-scan이 동작합니다.)

 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band