※ 본문은 김영한 선생님의 인프런 '스프링 핵심 원리 - 기본편' 강의를 듣고 정리한 내용임을 알립니다.
▶ 빈 생명주기 콜백이 필요한 이유
: 애플리케이션 시작 시점에 필요한 연결을 미리 해두고 애플리케이션 종료 시점에 연결을 모두 종료하는 작업에 객체의 초기화와 종료 작업이 필요
: '스프링 빈의 라이프 사이클 = 객체 생성 → 의존관계 주입'
→ 스프링 빈은 객체 생성 및 의존관계 주입이 다 끝난 다음에야 필요한 데이터를 사용할 수 있는 준비가 완료되므로, 초기화 작업은 의존관계 주입이 모두 완료된 다음에 호출해야 됨
But, 개발자가 의존관계 주입이 모두 완료된 시점을 어떻게 알 수 있을까?
→ 스프링은 의존관계 주입이 완료되면 스프링 빈에 콜백 메소드를 통해 초기화 시점을 알려주는 다양한 기능을 제공하며, 스프링 컨테이너가 종료되기 직전에 소멸 콜백을 줌으로써 안전하게 종료 작업을 진행할 수 있게 한다.
★ 스프링 빈의 이벤트 라이프 사이클
: 스프링 컨테이너 생성 → 스프링 빈 생성 → 의존관계 주입 → 초기화 콜백 → 사용 → 소멸 전 콜백 → 스프링 종료
★ 객체의 생성과 초기화를 분리하자.
: 생성자는 필수 정보(파라미터)를 받고, 메모리를 할당해서 객체를 생성하는 책임
: 반면에 초기화는 이렇게 생성된 값들을 활용해서 외부 커넥션을 연결하는 등 무거운 동작을 수행
→ 이 둘을 나누는 것이 유지보수 관점에서 좋다.
▶ 스프링이 빈 생명주기 콜백을 지원하는 3가지 방법
1. 인터페이스 InitializingBean, DisposableBean
→ implements InitializingBean, DisposableBean를 붙여서 사용
→ 단점 : 해당 코드가 스프링 전용 인터페이스에 의존 / 초기화, 소멸 메소드의 이름 변경 불가능 / 내가 코드를 고칠 수 없는 외부 라이브러리에 적용할 수 없음
→ 초창기에 나온 방법들이며, 지금은 더 나은 방법들이 있어서 거의 사용하지 않음
2. 설정 정보에 초기화 메소드, 종료 메소드 지정
→ @Bean(initMethod = "init", destroyMethod = "close")
→ 특징 : 메소드 이름을 자유롭게 설정 가능 / 스프링 빈이 스프링 코드에 의존하지 않음 / 코드가 아닌 설정 정보를 사용하기 때문에 코드를 고칠 수 없는 외부 라이브러리에도 초기화 및 종료 메소드 적용 가능
※ 종료 메소드 추론
: @Bean의 @destroyMethod의 특별한 기능
: destroyMethod의 기본값은 (inferred)(추론) 즉, close나 shutdown 같은 이름의 메소드를 자동으로 호출해줌
: 이름 그대로 종료 메소드를 추론해서 호출하는 방식
: 추론 기능을 원하지 않을 때에는 destroyMethod = "" 처럼 빈 공백으로 지정
3. @Post@PostConstructt, @PreDestroy 어노테이션 지원
→ 최신 스프링에서 권장하는 방법
→ 어노테이션 하나만 붙이면 되는 편리함
→ 자바 표준 기술이기 때문에 스프링이 아닌 컨테이너에서도 사용 가능
→ 컴포넌트 스캔과 잘 어울림
→ 유일한 단점은 외부 라이브러리에는 적용 X / 외부 라이브러리를 초기화, 종료해야 하면 @Bean의 기능을 사용할 것
=> @Post@PostConstructt, @PreDestroy 어노테이션을 사용하자!
'JVM > Spring' 카테고리의 다른 글
Spring Boot 핵심 개념들 (0) | 2021.08.23 |
---|---|
싱글톤 빈과 프로토타입 스코프 (0) | 2021.03.25 |
ComponentScan과 의존관계 주입 방법에 대해서 (0) | 2021.03.24 |
싱글톤 컨테이너 (0) | 2021.03.24 |
스프링 컨테이너와 스프링 빈 (0) | 2021.03.23 |