🌐 서버 구동 시 전체 흐름
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이 동작합니다.)