아래 스프링 생명주기 공부한 애가 좀 헷갈려하는거 같아서 적어본다.
1. init() -> service() -> destroy()
이건 서블릿 컨테이너(톰캣 같은 놈) 기준 생명주기임.
- 서블릿 컨테이너 = 자바 서블릿 스펙 구현체
- 웹 통신(HTTP 요청/응답) 받아서
HttpServletRequest/Response 만들고
필터 체인 돌리고
최종적으로 서블릿 호출
서블릿은 스프링이 아님.
헷갈리면 안 된다. 서블릿은 스프링이 아니다.
자프링 공화국에서 뭐 그냥 MVC 찍어내는걸로 스프링을 쓰니까 웹 찍어내는 게 디폴트라 스프링=웹처럼 보이고,
스프링부트 쓰면 임베디드 톰캣 붙어서 “부트가 다 해주는 느낌” 나고 디스패처서블릿(DispatcherServlet) 계속 보니까 헷갈리나 싶다.
그럼 스프링 라이프사이클은 뭘 기준으로 봐야하는가?
맨날 듣고 쓰는 Bean이 스프링 프레임워크의 기본 단위다.
스프링은 결국 IoC/DI, singleton/prototype 스코프, proxy(AOP, 트랜잭션 등)
이런 개념을 빈 중심으로 구현해둔 프레임워크일 뿐임
이거 자체가 웹 통신을 해주진 않는다.
생각해봐라 스프링 코어만 그래들 빌드 떄리면 http 통신 받을수 있냐?
못 받음 ㅋ
웹은 spring-web, spring-webmvc 같은 스타터가 따로 있음
그러면 이 빈은 어떤 순서로 등록되는지 확인해 보면
좀 더 확장해서 보면
(입력) 구성 소스: @Configuration, @Bean, XML, ComponentScan ...
|
v
BeanDefinition(설계도)들이 BeanFactory(DefaultListableBeanFactory)에 등록됨
|
v
ApplicationContext.refresh()
1) BeanFactory 준비
2) BeanFactoryPostProcessor 실행 (설계도 손보기)
3) BeanPostProcessor 등록 (객체 생성 후처리/프록시 관문)
4) preInstantiateSingletons (싱글턴 실제 인스턴스화)
|
v
(출력) 완성된 빈 그래프 + 런타임 기능(이벤트/리소스/i18n 등)
[런타임]
getBean()/DI로 빈 사용 (요청 처리 중 계속)
|
[Application Stop]
|
ApplicationContext.close()
-> destroy 콜백(@PreDestroy/DisposableBean 등)
이렇게 되고 이걸 톰캣같은 서블릿 컨테이너랑 같이보면
Tomcat(WebApp Start)
|
+-- Filter 생성/init
|
+-- DispatcherServlet 생성/init <--- (서블릿 생명주기)
|
+-- (내부에서) WebApplicationContext 생성/refresh
|
+-- BeanDefinition 등록
+-- BFPP/BPP
+-- Bean 생성/초기화/프록시 <--- (스프링 생명주기)
[요청]
Tomcat Thread
-> Filter chain
-> DispatcherServlet.service()
-> Spring MVC 라우팅/컨트롤러 호출
-> (컨트롤러/서비스 빈 사용)
뭐 간단하게는 이렇게 된다.
그냥 헷갈리지않았으면 한다.
취준이면 API 뽑아내면서 스프링 MVC 할건데 열심히 했으면 좋겠다.
화이팅이다 모두.
이렁거좋아
AI 시대에 보기 드물어진 분석글 - dc App
스프링 공식문서가면 훨씬 이쁘게 잘 설명되어있다. 기계번역 퀄도 좋으니까 가서 봐봐들 재밌어 - dc App
좋은글고맙다
자바 안쓰지만 꼴릿한 글이구나 - dc App
근데 사람들이 말하는 스프링이란거 자체가 스프링 MVC를 그냥 통칭 스프링이라 부르는거라 그냥 서블릿이 스프링안에 든거라고 봐도 되지않나 아님말구
맞아 실무에서는 웹찍어내는게 맞아서 다만 취준입장에서는 WS WAS 프레임워크 구분해서 알고있으면 기술면접때 도움은 될것같은 정도 - dc App
와우 나도 옛날에 Spring 처음 공부할때 이해안되서 디버깅 찍어서 이해 겨우햇는데.... 서블릿의 개념이 결국 톰캣에 기준 스펙이라는것도 겨우겨우 공식문서 보면서 알았는데
대단해 이젠 고수가 되어있잖아 - dc App