[Spring]스프링 핵심 원리(기본편) - 8. 빈 생명주기 콜백

Wooyong Jung·2023년 9월 18일
0
post-thumbnail
post-custom-banner
  • 해당 게시물은 인프런 "스프링 핵심 원리 - 기본편" 강의를 참고하여 작성한 글입니다.
  • 자세한 코드 및 내용은 강의를 참고해 주시길 바랍니다.
    강의링크 -> 스프링 핵심 원리 - 기본편 (김영한)

Section8. 빈 생명주기 콜백


📄 빈 생명주기 콜백 시작

데이터베이스 커넥션 풀이나, 네트워크 소켓처럼 애플리케이션의 시작 시점에 필요한 연결을 미리 해두고 애플리케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면, 객체의 초기화와 종료 작업이 필요하다. 그러기 위해서 스프링 빈이 생성되거나 죽기 직전에 스프링이 빈 안에 있는 매서드를 호출해주는 기능이 존재한다.

스프링은 의존관계 주입이 완료되면 스프링 빈에게 콜백 메서드를 통해 초기화 시점을 알려주는 다양한 기능을 제공한다. 또 스프링 컨테이너가 종료되기 직전에 소멸 콜백을 준다.

1) 인터페이스 InitializingBean, DisposableBean

public class NetworkClient implements InitializingBean, DisposableBean {
		
        ...
        
    // 의존 관계 주입이 완료된 후 호출
    @Override
    public void afterPropertiesSet() throws Exception {
        connect();
        call("초기화 연결 메시지");
    }

    // 빈이 소멸되기 직전 호출
    @Override
    public void destroy() throws Exception {
        disconnect();
    }
  • 스프링 전용 인터페이스이기 때문에 해당 코드가 스프링 전용 인터페이스에 의존한다.
  • 초기화, 소멸 메서드의 이름을 변경할 수 없다.
  • 코드를 고칠 수 없는 외부 라이브러리에 적용할 수 없다.
  • 스프링 초창기에 나온 방법들이고, 지금은 다음의 더 나은 방법들이 있어서 거의 사용하지 않는다.

2) 빈 등록 초기화, 소멸 메서드

public class BeanLifeCycleTest {

		...
    
    @Configuration
    static class LifeCycleConfig {

        @Bean(initMethod = "init", destroyMethod = "close")
        public NetworkClient networkClient() {
        	...
        }
    }
}
  • 매서드 이름을 자유롭게 줄 수 있다.
  • 스프링 빈이 스프링 코드에 의존하지 않는다.
  • 코드가 아닌 설정 정보를 사용하기 때문에 코드를 고칠 수 없는 외부 라이브러리에도 초기화, 종료 메서드를 적용할 수 있다.

3) 애노테이션 @PostConstruct, @PreDestroy

    @PostConstruct
    public void init() throws Exception {
    	...
    }

    // 빈이 소멸되기 직전 호출
    @PreDestroy
    public void close() throws Exception {
        ...
    }
  • 매우 편리하고 최신 스프링에서 가장 권장하는 방법이다.
  • javax 패키지이므로 스프링에 종속적인 기술이 아니라 자바 표준이다. 따라서 스프링이 아닌 다른 컨테이너에서도 동작한다.
  • 유일한 단점이 외부 라이브러리에는 적용하지 못한다는 것인데 이 경우에는 2번째로 배운 @Bean의 기능을 사용하자.

=> @PostConstruct, @PreDestroy 애노테이션을 사용하되 코드를 코칠 수 없는 외부 라이브러리를 초기화, 종료해야 하면 @Bean의 initMetohd와 destroyMethod를 사용하자

profile
실패를 두려워하지 않는 백엔드 개발자가 되기 위해 노력하고 있습니다.
post-custom-banner

0개의 댓글