스프링 빈 생명주기(Bean LifeCycle)
스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존 관계 주입 -> 초기화 콜백 -> 사용 -> 소멸 콜백 -> 스프링 종료
Spring Bean은 위와 같은 생명 주기를 가진다.
스프링 빈으로 등록되는 객체를 사용하기 위해서는 객체가 생성된 후 의존성 주입까지(Dependency Injection) 끝나야 해당 객체를 사용할 수 있게 된다.
(생성자 주입 방식의 경우 '객체 생성' -> '의존 관계 주입'의 과정이 한 번에 처리된다.)
그리고 의존 관계가 주입된 후에 값을 설정해주는 단계를 초기화 단계라고 한다.
스프링에서는 스프링 빈이 의존 관계 주입이 완료되면 콜백 메서드를 통해 초기화 시점을 알려주는 기능을 제공하며(초기화 콜백), 이것을 통해 개발자는 의존 관계 주입이 완료된 상태에서 필요한 기능을 수행할 수 있게 된다.
(스프링 컨테이너의 소멸 시점에서도 콜백 메서드를 통해 필요한 기능을 수행할 수 있으며, 이것을 '소멸 콜백'이라고 합니다.)
스프링 빈의 생명주기 콜백을 관리하는 방법
- 인터페이스 (InitializingBean, DisposableBean) 상속
- 설정 정보에 초기화 메서드, 종료 메서드 지정
- @PostConstruct, @PreDestroy 어노테이션
스프링 빈에서는 위 3가지 방법을 통해 생명주기 콜백(초기화 콜백, 소멸 콜백)을 지원한다.
실무에서 가장 간편하게 사용되며 Spring에서도 권고하는 방법이 바로 @PostConstruct, @PreDestroy 어노테이션을 통한 방법이다.
@PostConstruct란?
@PostConstruct는 빈이 생성되고 의존 관계 주입이 완료된 후 실행되는 '초기화 콜백'을 적용할 수 있는 어노테이션이다.
[호출 순서]
1.생성자 호출
2. 의존성 주입 완료 (@Autowired || @RequiredArgsConstructor )
3. @PostConstruct
특징
- 해당 어노테이션이 적용된 메서드는 모든 access level을 가질 수는 있지만 static 메서드는 될 수 없다.
- 이 어노테이션이 적용된 메서드는 다른 리소스에서 호출되지 않아도 어플리케이션 서버 기동 시 자동으로 수행된다.
- @PostConstruct, @PreDestroy 어노테이션은 Spring에 종속된 기술이 아니라 javax.annotation 패키지에 포함되어 있는 자바 표준 기술 JSR-250이므로 스프링이 아닌 다른 프레임워크에서도 동작한다는 특징이 있다.
왜 사용하는가?
1) 생성자가 호출되었을 때, bean은 초기화 전이다.(DI가 이루어 지기 전)
@PostConstruct 를 사용하면, bean이 초기화 됨과 동시에 의존성을 확인할 수 있다.
2) bean lifecycle에서 오직 한 번만 수행된다는 것을 보장할 수 있다. (WAS가 올라가면서 bean이 생성될 때 딱 한 번 초기화함) 그래서 @PostConstruct를 사용하면 bean이 여러번 초기화되는 것을 방지할 수 있다.
@PostConstruct 사용 예시
@RequiredArgsConstructor
@Component
public class DBInit {
private final MemberRepository memberRepository;
@PostConstruct
public void setDefaultAdmin() {
Member adminMember = new Member("admin", "password");
memberRepository.save(adminMember);
}
}
주의할 점으로는 @PostConstruct 어노테이션은 해당 빈 자체만 생성된다고 가정되어 호출된다는 것이다.
즉, 해당 빈에 관련된 AOP 등을 포함한 전체 스프링 어플리케이션 컨텍스트(Application Context)가 초기화된 것을 의미하지 않으며, 트랜잭션을 처리하는 AOP 등은 스프링의 후 처리기(Post Processer)가 완전히 동작된 후 스프링 어플리케이션 컨텍스트의 초기화가 완료되어야 적용된다는 이슈가 있다.
https://velog.io/@limsubin/Spring-Boot%EC%97%90%EC%84%9C-PostConstruct-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90
https://wildeveloperetrain.tistory.com/221