반응형

 

 

"김영한 스프링 핵심 원리 기본편" 내용을 기반으로 작성한 내용입니다.

 

스프링 핵심 원리 - 기본편 강의 | 김영한 - 인프런

김영한 | 스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., 스프링 핵심 원리를 이해하고, 성장하는 백엔드 개발자가 되어보

www.inflearn.com

📝Bean의 라이프 사이클 관리

Bean의 라이프 사이클은 아래와 같다.

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

 

다양한 방법이 있는데 필요한 것만 소개합니다.

 

방법1 (initMethod, destroyMethod)

public class NetworkClient {
	private String url;

    public NetworkClient() {
    	System.out.println("생성자 호출, url = " + url);
    }

    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);
    }

    public void init() {
    	System.out.println("NetworkClient.init");
    	connect();
    	call("초기화 연결 메시지");
    }
    public void close() {
    	System.out.println("NetworkClient.close");
    	disConnect();
    }
}

// Bean 관리
@Configuration
static class LifeCycleConfig {

    @Bean(initMethod = "init", destroyMethod = "close")
    public NetworkClient networkClient() {
        NetworkClient networkClient = new NetworkClient();
        networkClient.setUrl("http://hello-spring.dev");
        return networkClient;
    }
}

Spring에서 제공하는 기능을 사용합니다. initMethod초기화 콜백을 설정할 수 있고 destoryMethod를 통해 종료 콜백을 설정할 수 있습니다. 하지만 스프링 전용이라 스프링에 의존적입니다.

 

방법2 (@PreConstruct, @PostConstruct)

public class NetworkClient {
    private String url;
    
    public NetworkClient() {
    	System.out.println("생성자 호출, url = " + url);
    }
    
    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);
    }
    
    @PostConstruct
    public void init() {
        System.out.println("NetworkClient.init");
        connect();
        call("초기화 연결 메시지");
    }
    
    @PreDestroy
    public void close() {
        System.out.println("NetworkClient.close");
        disConnect();
    }
}

// Bean 관리
@Configuration
static class LifeCycleConfig {

    @Bean
    public NetworkClient networkClient() {
        NetworkClient networkClient = new NetworkClient();
        networkClient.setUrl("http://hello-spring.dev");
        return networkClient;
    }
}

@PreDestory초기화 작업설정@PostConstruct종료 작업설정을 할 수 있습니다.

해당 어노테이션은 Java에서 제공하는 기능으로 스프링에 의존적이지 않습니다.

 

 

방법2를 많이 씁니다. 만약 외부 라이브러리에다가 적용이 필요한 경우(해당 외부라이브러리를 직접 수정할 수 없기 때문에)는 Bean을 따로 생성해서 거기에서 외부라이브러리 호출한 다음 새로운 Bean을 만들어서 사용하면 될 거 같다.

 

📝참고

객체 생성할 때 생성자 작업하고 초기화 작업은 분리시키는게 유지보수에 좋다. 생성자 작업의 경우는 필드 Injection을 하고 초기화 작업의 경우 DB Connection따위와 같은 작업이 들어간다.

반응형