스프링 핵심 원리 - 빈 생명주기 콜백

hyuk·2023년 10월 23일
0
post-thumbnail

📌 빈 생명주기 콜백

애플리케이션의 종료 시점에는 데이터베이스 커넥션 풀 혹은 네트워크 소켓과 같이 애플리케이션 시작 시점에 필요한 연결을 종료하기 위해, 객체의 초기화와 종료 작업이 필요하다.

스프링 빈은 객체 생성 ➔ 의존관계 주입의 라이프사이클을 가지고 있어 초기화 작업은 의존관계 주입이 완료된 뒤에 호출해야 한다. 그럼 개발자는 의존관계 주입이 완료된 시점을 어떻게 파악할까?

바로 ! 스프링이 제공하는 콜백 메서드(초기화 콜백 / 소멸 전 콜백) 기능을 활용하는 것이다.

❗ 스프링 빈의 이벤트 라이프사이클
: 컨테이너 생성 ➔ 빈 생성 ➔ 의존관계 주입 ➔ 초기화 콜백 ➔ 사용 ➔ 소멸전 콜백 ➔ 스프링 종료


1. InitializingBean, DisposableBean

스프링은 크게 3가지 방법으로 빈 생명주기 콜백을 지원한다.

첫 번째로, InitializingBean, DisposableBean 인터페이스를 상속받아 사용한다.

      public class xxxxxx implements InitializingBean, DisposableBean {
            
            ··· 중략 ···
            
      		@Override
 			public void afterPropertiesSet() throws Exception {
				··· 생략 ···
 			}
            
            @Override
 			public void destroy() throws Exception {
 				··· 생략 ···
 			}
            
      }
  • InitializingBean : afterPropertiesSet() 메서드로 초기화를 지원한다.

  • DisposableBean : destroy() 메서드로 소멸을 지원한다.

인터페이스(InitializingBean, DisposableBean) 단점

  1. 초기화, 소멸 메서드의 이름을 변경 ❌

  2. 외부 라이브러리 적용 ❌

  3. 이 인터페이스는 스프링 인터페이스로, 스프링 인터페이에 의존


2. 빈 등록 초기화/소멸메서드

인터페이스(InitializingBean, DisposableBean)와 달리 설정 정보에 @Bean(initMethod = "init", destroyMethod = "close") 같이 초기화, 소멸 메서드를 지정할 수 있다.

@Configuration
      static class AppConfig {
        
            ··· 중략 ···
            
      		@Bean(initMethod = "init", destroyMethod = "close")
       		public Velog velog() {
                ··· 생략 ···
			}
       }

설정정보 초기화/소멸 메서드 사용의 특징

  1. 메서드 이름을 자유롭게 설정 가능

  2. 외부 라이브러리에도 초기화, 종료 메서드를 적용 가능

  3. 스프링 빈이 스프링 코드에 의존 ❌

  4. @BeandestroyMethod 속성에는 기본값이 (inferred) (추론)으로 등록되어 있어, close, shutdown이라는 이름을 자동으로 종료메서드로 호출한다.
    종료 메소드를 따로 부여하지 않더라도 잘 작동한다.

❗추론 기능을 사용하기 싫다면 destroyMethod="" 처럼 빈 공백을 지정하면 된다.


3. @PostConstruct, @PreDestroy

최신 스프링에서 가장 권장하는 방법으로 매우 편리하다.

 	@PostConstruct
 	public void init() {
		··· 생략 ···
 	}
    
 	@PreDestroy
 	public void close() {
		··· 생략 ···
 	}

@PostConstruct, @PreDestroy 애노테이션 특징

  1. 외부 라이브러리 사용 ❌

  2. 스프링에 종속적인 기술이 아닌 자바 표준으로, 다른 컨테이너에서도 동작한다.

❗ 외부 라이브러리를 초기화, 종료시 @Bean- initMethod, destroyMethod 사용하자.


📌 본 포스트는 스프링 핵심 원리 - 기본편 통해 학습한 내용을 요약 및 정리한 것입니다.

profile
차곡차곡쌓아가는학습노트

0개의 댓글