빈 생명주기 콜백

qkrrnjswo·2023년 4월 17일
0

Inflearn Spring

목록 보기
12/13

빈 생명주기 콜백 시작

데이터베이스 커넥션 풀이나, 네트워크 소켓처럼
초기화 작업과 종료 작업이 어떻게 진행되는지 알아보자!

스프링 빈의 이벤트 라이프사이클(싱글톤)

스프링 컨테이너 생성 => 스프링 빈 생성 => 의존관계 주입 => 초기화 콜백 => 사용 => 소멸전 콜백 => 스프링 종료

초기화 콜백: 빈을 생성, 빈의 의존관계 주입이 완료된 후 호출
소멸전 콜백: 빈이 소멸되기 직전에 호출

💡객체의 생성과 초기화를 분리하자!
=> 일반적으로 생성자안에서는 가벼운 객체를 생성하는 작업을 하고,
초기화에서는 외부 커넥션을 연결하는등의 무거운 동작을 수행한다.
따라서 유지보수의 관점에서 분리하는 것이 유리!

인터페이스 InitializingBean, DisposableBean

public class A implements InitializingBean, DisposableBean {

	//서비스 시작시 호출
    public void connect() {
    	System.out.println("connect: " + url);
    }
    public void call(String message) {
    	System.out.println("call: " + url + " message = " + message);
    }
    //서비스 종료시 호출
    public void disConnect() {
    	System.out.println("close + " + url);
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        connect();
        call("초기화 연결 메시지");
    }
    
    @Override
    public void destroy() throws Exception {
        disConnect();
    }
 }

빈 등록 초기화, 소멸 메서드 지정

장점

  • 메서드 이름을 자유롭게 사용가능
  • 빈이 스프링 코드에 의존하지 않음
  • 설정 정보를 상용하기 때문에 외부라이브러리에도 초기화 종료 메서드 적용 가능!
public class A {

	...

    public void init() {
    	System.out.println("NetworkClient.init");
    	connect();
    	call("초기화 연결 메시지");
    }
    public void close() {
    	System.out.println("NetworkClient.close");
    	disConnect();
    }
 }
========================================= 
@Configuration
static class LifeCycleConfig {
	//여기서 등록을 한다!
	@Bean(initMethod = "init", destroyMethod = "close")
	public NetworkClient networkClient() {
        NetworkClient networkClient = new NetworkClient();
        networkClient.setUrl("http://hello-spring.dev");
        return networkClient;
	}
}
 

설정 정보에 초기화 소멸 메서드 지정(이거 사용하면 됨)

public class A {
    @PostConstruct
        public void init() {
        System.out.println("NetworkClient.init");
        connect();
        call("초기화 연결 메시지");
    }
    @PreDestroy
    public void close() {
        System.out.println("NetworkClient.close");
        disConnect();
	}
}
========================================= 
@Configuration
static class LifeCycleConfig {
	//쓰지 않아도 사용 가능!
	@Bean
	public NetworkClient networkClient() {
        NetworkClient networkClient = new NetworkClient();
        networkClient.setUrl("http://hello-spring.dev");
        return networkClient;
	}
}

💡 외부 라이브러리를 초기화, 종료해야 하면 @Bean 의 initMethod , destroyMethod를 사용 하면 됨!

0개의 댓글