본문 바로가기
Spring

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

by jeonghaemin 2021. 1. 12.
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("소멸 메소드 호출");
    }
}

참고

댓글