스프링 기본 - 섹션8. 빈 생명주기 콜백
CS/김영한 스프링 강의

스프링 기본 - 섹션8. 빈 생명주기 콜백

 

일단 이게 뭐냐면, 스프링 빈의 라이플사이클은

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

이다.

 

객체에서 생성자와 초기화를 분리하는게 좋은데, 생성은 메모리에 공간 확보해서 생성하는 책임이 있고, 초기화는 외부 커넥션 등 무거운 책임을 가진다. 그래서 객체 생성 부분과 초기화 부분을 나누는게 더 좋다고 한다. 그래서 밑에 예제 보면 생성하고 set은 나중에 함.

 

결론은 그냥 @PostConstruct, @PreDestroy 써라. 유일한 단점은 외부 라이브러리에는 적용하지 못한다고 해서 이럴땐 @Bean에서 초기화 함수, 소멸 함수 정하는거 쓰자.

 

 

 

 

 

 

public class NetworkClient implements InitializingBean, DisposableBean {

    private String url;

    public NetworkClient() {
        System.out.println("생성자 호출, url = " + url);
//        connect();
//        call("초기화 연결 메시지");
    }

    public void setUrl(String url) {
        this.url = url;
    }

    // 서비스 시작 시 호출
    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 {
        System.out.println("NetworkClient.afterPropertiesSet()");
        connect();
        call("초기화 연결 메시지");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("NetworkClient.destroy()");
        disconnect();
    }
}

 

 

 

이 이름 정해서 하는 것의 대단함은 destroyMethod를 정하지 않으면 많은 라이브러리에서 닫는 함수를 'close', 'destroy', 'disconnect'같은걸 쓰니 이것들을 추론해서 시도해 본다는 것.