Spring

[스프링] 빈 초기화, 소멸 메소드 사용하기

jeonghaemin 2021. 1. 12. 23:50
728x90

생성자 안에서 무거운 초기화 작업을 하는 것보다는 객체를 생성하는 부분, 초기화 부분을 명확하게 나누는 것이 유지보수 관점에서 좋다. 초기화 작업이 내부 값들만 약간 변경하는 정도의 단순한 경우라면 생성자에서 한 번에 처리하는 게 더 나을 수 있다.

스프링 컨테이너가 생성되고 빈의 생성과 의존관계 주입이 완료료되면 콜백을 통해 초기화 시점을 알려주고, 스프링 컨테이너가 종료되기 직전에 소멸 콜백을 준다.

스프링의 초기화, 소멸 작업 방법

  • 스프링의 인터페이스 구현
  • 빈을 등록할 때 초기화, 소멸 메소드 지정
  • @PostConstruct, @PreDestroy 애노테이션 사용(권장되는 방법)

인터페이스 구현

  • InitializingBean, DisposableBean 인터페이스를 구현한다.
    • afterPropertiesSet() : 빈의 생성과 의존관계 주입 완료 후 호출된다.
    • destroy() : 스프링 컨테이너가 종료되기 직전에 호출된다.
  • 스프링 초창기에 나온 방법으로, 지금은 거의 사용하지 않는 방법이다.
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

public class Hello implements InitializingBean, DisposableBean {

    //빈의 생성과 의존관계 주입 완료 후 호출
    @Override
    public void afterPropertiesSet() throws Exception {
            System.out.println("초기화 메소드 호출");
    }

    //스프링 컨테이너가 종료되기 직전에 호출
    @Override
    public void destroy() throws Exception {
            System.out.println("소멸 메소드 호출");
    }
}

빈을 등록할 때 초기화, 소멸 메소드 지정

  • @Bean 애노테이션의 initMethod, destroyMethod 속성을 사용하여 각각 초기화, 소멸 메소드를 지정해 줄 수 있다.
  • 초기화, 소멸 메소드 이름을 자유롭게 줄 수 있다.
public class Hello  {

    public Hello() {
        System.out.println("생성자 호출");
    }

    public void init() {
        System.out.println("초기화 메소드 호출");
    }

    public void close() {
        System.out.println("소멸 메소드 호출");
    }
}
@Configuration
public class AppConfig {

    @Bean(initMethod = "init", destroyMethod = "close")
    public Hello hello() {
        return new Hello();
    }
}

destroyMethod 속성은 따로 값을 지정해주지 않아도 종료 메소드를 추론해서 호출해주는 기능을 가지고 있는데 close, shutdown 이름을 가진 메소드를 자동으로 호출해준다.

위 예제의 경우 소멸 메소드로 사용할 메소드 이름이 close이기 때문에 destroyMethod 속성 값을 입력하지 않아도 자동으로 호출이 된다.

이 기능을 사용하고 싶지않다면 destroyMethod 속성 값에 빈 공백("")을 전달해주면 된다.

@PostConstruct, @PreDestroy 애노테이션 사용

  • 스프링에서 권장하는 방법으로 애노테이션 하나만 붙여주면 되기 때문에 편리하다.
  • @PostConstruct : 초기화 메소드에 붙혀준다.
  • @PreDestroy : 소멸 메소드에 붙혀준다.
public class Hello  {

    public Hello() {
        System.out.println("생성자 호출");
    }

    @PostConstruct
    public void init() {
        System.out.println("초기화 메소드 호출");
    }

    @PreDestroy
    public void destroy() {
        System.out.println("소멸 메소드 호출");
    }
}

참고