Spring Container은 Bean객체들의 생성과 소멸을 관리한다.
-> 생명주기(Lifecycle)을 관리한다.
스프링 빈은 간단하게 다음과 같은 라이프사이클을 갖는다.
객체 생성 -> 의존관계 주입
(생성자주입은 예외 : 객체를 만들 때 파라미터로 빈이 미리 들어와야 하기 때문에)
스프링 빈의 이벤트 라이프사이클 (싱글톤)
스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백 -> 사용 -> 소멸전 콜백 -> 스프링 종료
* 초기화 콜백 : 빈이 생성되고, 빈의 의존관계 주입이 완료된 후 호출
* 소멸전 콜백 : 빈이 소멸되기 직전에 호출
* 객채의 생성과 초기화를 명확하게 분리하는 것이 좋다.
객체 생성은 메모리에 할당하는 것 까지만, 최소 필요한 데이터를 셋팅 하는것 까지만 한다.
반면 초기화는 이렇게 생성된 값들을 활용해서 외부 커넥션을 연결하는 등 무거운 동작을 수행한다.
(초기화 작업이 내부 값들만 약간 변경하는 정도로 단순한 경우에는 생성자에서 한번에 다 처리하는 것도 좋다)
* 생명주기 콜백 3가지 방법
1. 인터페이스 사용 - InitializingBean, DesposableBean
InitializingBean 인터페이스를 상속받아 afterPropertiesSet() 메서드를 사용
-> 초기화 후 호출
DesposableBean 인터페이스를 상속받아 destroy() 메서드를 사용
-> 스프링 컨테이너가 내려가고 종료되기 전에 호출
-> 인터페이스를 사용하는 초기화, 종료 방법은 스프링 초장기에 나온 방법들이다.
지금은 거의 사용하지 않는다.
2. 설정 정보에 초기화 메서드, 종료 메서드 지정
@Bean에 initMethod와 destoryMethod를 메서드명으로 등록한 후 사용initMethod = "init" 등록 -> 초기화 후 호출destoryMehhod = "close" 등록 -> 스프링 컨테이너가 내려가고 종료되기 전에 호출
-> 코드가 아니라 설정 정보를 사용하기 때문에 코드를 고칠 수 없는 외부 라이브러리에도 초기화, 종료 메서드를 적용할 수 있다.
3. @PostConstruct, @PreDestory 어노테이션 지원
- 직접 생성한 메서드(init, close) 상단에 @PostConstruct, @PreDestory 어노테이션 설정
스프링에 종속적인 기술이 아니라 JRE-250라는 자바 표준이다. 스프링이 아닌 다른 컨테이너에서도 동작
init() -> 초기화 후 호출
close() -> 스프링 컨테이너가 내려가고 종료되기 전에 호출
-> 최신 스프링에서 가장 권장하는 방법이다.
정리 :
1. @PostConstruct, @PreDestory 어노테이션을 사용하자.
2. 코드를 고칠 수 없는 외부 라이브러리를 초기화, 종료해야 한다면 2번을 사용하자.
참고 및 출처 :
https://www.inflearn.com/ - 스프링 핵심 원리(김영한)
'Spring' 카테고리의 다른 글
[Spring] 유효성 검사(Validating Form) (0) | 2021.08.18 |
---|---|
[Spring] HTTP 메시지 컨버터 (HttpMessageConverter) (0) | 2021.08.02 |
[Spring] 다양한 요청 매핑(Request Mapping) (0) | 2021.08.01 |
[Spring] 동시요청 - 쓰레드와 멀티 쓰레드(multi thread) (0) | 2021.07.22 |
[Spring] 웹 서버 vs 웹 어플리케이션 서버 (0) | 2021.07.22 |