스프링 빈 이벤트 라이프 사이클
- 스프링 IoC 컨테이너 생성 → 스프링 빈 생성 → 의존관계 주입 → 초기화 콜백 메소드 호출 → 사용 → 소멸 전 콜백 메소드 호출 → 스프링 종료
- 스프링은 의존관계 주입이 완료되면 스프링 빈에게 콜백 메소드를 통해 초기화 시점을 알려주며, 스프링 컨테이너가 종료되기 직전에도 소멸 콜백 메소드를 통해 소멸 시점을 알려준다.
스프링 빈 라이프 사이클을 압축시키기 위해 생성자 주입을 통해 빈 생성과 초기화를 동시에 진행하면 되지 않을까? -> 객체의 생성과 초기화를 분
- 생성자는 파라미터를 받고, 메모리를 할당해서 객체를 생성하는 책임을 가진다. 반면에 초기화는 이렇게 생성된 값들을 활용해서 외부 커넥션을 연결하는 등 무거운 동작을 수행한다.
- 따라서 생성자 안에서 무거운 초기화 작업을 함께 하는 것보다는 객체를 생성하는 부분과 초기화 하는 부분을 명확하게 나누는 것이 유지보수 관점에서 좋다.
- 물론, 초기화 작업이 내부 값들만 약간 변경하는 정도로 단순한 경우에는 생성자에서 한번에 처리하는게 나을 수 있다.
Bean LifeCycle callback(빈 생명주기 콜백함수)
- callback : 주로 콜백함수를 부를 때 사용되는 용어이며 콜백함수를 등록하면 특정 이벤트가 발생했을 때 해당 메소드가 호출된다.
- lifecycle callback
- Bean을 생성하고 초기화하고 파괴하는 등 특정 시점에 호출되도록 정의된 함수
- 주로 많이 사용되는 콜백
- @PostConstruct : 빈 생성 시점에 필요한 작업을 수행
- @PreDestroy : 빈 파괴(주로 어플리케이션 종료) 시점에 필요한 작업을 수행
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
public class ExampleBean {
@PostConstruct
public void initialize() throws Exception {
// 초기화 콜백 (의존관계 주입이 끝나면 호출)
}
@PreDestroy
public void close() throws Exception{
// 소멸 전 콜백 (메모리 반납, 연결 종료와 같은 과정)
}
}
- 장점
- 스프링이 아닌 다른 컨테이너에서도 동작한다.
- 컴포넌트 스캔에 용이하다
- 단점
- 외부 라이브러리에서 적용이 불가능하다.
- 외부 라이브러리에서 초기화, 종료를 해야 할 경우 두 번째 방법 즉, @Bean의 initMethod와 destoryMethod 속성을 사용해야한다.
- 외부 라이브러리에서 적용이 불가능하다.
- 빈 생명주기 콜백의 필요성
- 보통 프로젝트를 하다보면 DB연결, 네트워크 소켓 연결 등과 같이 시작 시점에 미리 연결한 뒤 어플리케이션 종료시점에 연결을 종료해야 하는 경우 객체의 초기화 및 종료 작업이 필요할 것이다.
(Ex. 커넥션 풀의 connect & disconnect)스프링 빈도 위와 같은 원리로 초기화 작업과 종료 - 스프링 빈도 위와 같은 원리로 초기화 작업과 종료 작업이 나눠서 진행된다.
- 객체 생성 → 의존관계 주입이라는 라이프사이클을 가진다.
- 스프링 빈은 의존관계 주입이 다 끝난 다음에야 필요한 데이터를 사용할 수 있는 준비가 완료된다.
- 보통 프로젝트를 하다보면 DB연결, 네트워크 소켓 연결 등과 같이 시작 시점에 미리 연결한 뒤 어플리케이션 종료시점에 연결을 종료해야 하는 경우 객체의 초기화 및 종료 작업이 필요할 것이다.
'개발 > Spring' 카테고리의 다른 글
MVC 패턴(1) - 요구사항 설계 (0) | 2024.02.15 |
---|---|
AOP(Aspect Oriented Programming) (0) | 2024.02.06 |
IoC 컨테이너 (0) | 2024.02.04 |
IoC(Inversion Of Controll) (0) | 2024.02.04 |
DI(Dependency Injection) (0) | 2024.02.04 |