본문 바로가기

SPRING/Spring

[스프링| 스프링 핵심 원리 | 기본편 | 빈 생명주기 콜백] 인터페이스 InitializingBean, DisposableBean / 빈 등록 초기화, 소멸 메서드 지정 / @PostConstruct, @PreDestroy

public class NetworkClient implements InitializingBean, DisposableBean { // 스프링의 빈 생명주기를 활용하여 초기화 및 소멸 메서드를 정의하는 클래스

    private String url; // 네트워크 연결을 위한 URL 저장 변수

    public NetworkClient() { // 클래스 생성자
        System.out.println("생성자 호출, url = " + url); // 생성자 호출 시 url 초기값(null)을 출력
        connect(); // 네트워크 연결 시도
        call("초기화 연결 메시지"); // 초기 메시지를 전송
    }

    public void setUrl(String url) { // URL 설정 메소드
        this.url = url; // 인스턴스 변수 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 { // InitializingBean 인터페이스를 구현한 초기화 메소드
        connect(); // 네트워크 연결 메소드 호출
        call("초기화 연결 메시지"); // 초기화 시 메시지 전송
    }
    
    @Override
    public void destroy() throws Exception { // DisposableBean 인터페이스를 구현한 소멸 메소드
        disConnect(); // 네트워크 연결 해제 메소드 호출
    }

}

@Configuration // 스프링 설정 클래스를 선언, 이 클래스에서 빈의 정의를 함
static class LifeCycleConfig { // 빈의 생명주기 관리를 위한 설정 클래스

    @Bean(initMethod = "init", destroyMethod = "close") // 스프링 빈을 선언하고, 초기화 및 소멸 메소드를 지정
    public NetworkClient networkClient() { // NetworkClient 타입의 빈을 생성하는 메서드
        NetworkClient networkClient = new NetworkClient(); // NetworkClient 객체를 생성
        networkClient.setUrl("http://hello-spring.dev"); // 생성된 객체에 URL을 설정
        return networkClient; // 설정된 객체를 반환, 스프링 컨테이너에 등록
    }
}

애노테이션 @PostConstruct, @PreDestroy

public class NetworkClient { // 네트워크 클라이언트 기능을 제공하는 클래스

    private String url; // 네트워크 연결을 위한 URL 저장 변수

    public NetworkClient() { // 클래스 생성자
        System.out.println("생성자 호출, url = " + url); // 생성자가 호출될 때 url의 현재 상태(여기서는 null)를 출력
        connect(); // 네트워크 연결 메소드 호출
        call("초기화 연결 메시지"); // 초기 연결 시 메시지를 전송하는 메소드 호출
    }

    public void setUrl(String url) { // URL을 설정하는 메소드
        this.url = url; // 인스턴스 변수 url에 매개변수로 받은 url을 저장
    }

    public void connect() { // 네트워크 연결 메소드
        System.out.println("connect: " + url); // 연결을 시도하며 현재 url을 출력
    }

    public void call(String message) { // 네트워크를 통해 메시지를 전송하는 메소드
        System.out.println("call: " + url + " message = " + message); // 전송하는 메시지와 url을 출력
    }

    public void disConnect() { // 네트워크 연결을 해제하는 메소드
        System.out.println("close: " + url); // 연결 해제 시 url과 함께 출력
    }

    @PostConstruct // 초기화 콜백 애노테이션, 빈의 속성 설정 후 자동으로 호출됨
    public void init() { // 초기화 메소드
        System.out.println("NetworkClient.init"); // 초기화 시작을 알림
        connect(); // 네트워크 연결 메소드를 다시 호출
        call("초기화 연결 메시지"); // 초기화 과정에서 메시지를 전송
    }
    
    @PreDestroy // 소멸 콜백 애노테이션, 빈이 소멸되기 전에 자동으로 호출됨
    public void close() { // 소멸 메소드
        System.out.println("NetworkClient.close"); // 소멸 시작을 알림
        disConnect(); // 네트워크 연결 해제 메소드를 호출
    }
}

@PostConstruct 애노테이션은 빈의 모든 의존성이 주입되고, 스프링 컨테이너에 의해 완전히 초기화된 후에 실행해야 하는 메서드에 사용됩니다. 이 애노테이션은 빈의 생성자가 실행된 후, 그리고 스프링의 의존성 주입이 완료된 후에 호출됩니다. 주로 초기 설정이나 시작 로직을 실행하는 데 사용됩니다.

 

@PreDestroy 애노테이션은 스프링 컨테이너가 종료되기 전에 빈을 정리하거나 자원을 해제할 필요가 있을 때 사용됩니다. 이 애노테이션은 컨테이너에 의해 관리되는 빈이 제거되기 직전에 호출됩니다. 주로 자원 해제, 로그 작성, 연결 종료 등의 정리 작업에 쓰입니다.