[spring] Bean 생성 순서와 Bean Life Cycle (빈 생명주기)

2021. 12. 14. 21:07[ 백엔드 개발 ]/[ Spring ]

Bean 생성 순서

- Spring : 설정파일을 통해 등록된 bean을 자동적으로 위에서 아래로 bean들을 스캔하여 생성한다.

- Spring Boot : Annotation을 이용해서 bean을 등록하게 되면 패키지에서 존재하는 순서대로(위에서 아래) 스캔하면서 bean을 생성한다. 따라서 알파벳 순서에서 밀린 패키지, 클래스는 생성 순서를 맞춰주지 않는 문제가 생길 수 있을 거라 생각하지만 특정 Bean을 생성하는 도중에 해당 Bean에 주입되는 새로운 Bean을 만나면 이 Bean부터 생성하기 때문에 문제가 되지 않는다.(단, 생성자 주입 방식일 경우에 해당)

 

위와 같이 XML, @Bean, @Configure, 또는 컴포넌트스캔 방식으로 bean으로 관리할 클래스를 스캔한 뒤 BeanFactory가 reflection을 이용해 bean들을 생성하고 의존관계를 주입한다.

 

 

[스프링 부트에서 컴포넌트 스캔방식 + 생성자 주입 방식인 경우]

- Bean 생성자 호출 순서 : controller -> service -> repository (패키지 알파벳 순)

- Bean 생성완료 순서: repository -> service -> controller  

 

[시나리오]

- controller의 생성자를 호출하고 생성자의 parameter를 보고 Bean이면 parameter를 먼저 생성하러 간다.(주입받는 의존성을 먼저 생성)

- 주입받을 의존성을 생성한 뒤 돌아와서 생성자 호출 로직을 이어간다.

 

 

cf. @PostConstruct : Bean이 완전히 생성된 이후에 실행되는 콜백 메소드

 

 

Bean Life Cycle

https://dahye-jeong.gitbook.io/til/spring/2021-05-17-bean-lifecycle

1) 스프링 컨테이너 생성

2) 스프링 빈 생성 및 의존관계 주입

3) 초기화 콜백 : 빈이 완전히 생성된 후 호출

4) 빈 사용

5) 소멸전 콜백 : 빈이 소멸되기 직전에 호출

6) 스프링 종료 : Bean 파괴는 생성의 역순임

 

 

 

Ref

- 생성자 기반 DI가 선호되는 이유: https://jh-labs.tistory.com/31