아래 스프링 생명주기 공부한 애가 좀 헷갈려하는거 같아서 적어본다.


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 할건데 열심히 했으면 좋겠다.

화이팅이다 모두.