본문 바로가기

스프링

빈 초기화 콜백, 소멸전 콜백

스프링 컨테이너, 빈 생명주기

스프링 컨테이너의 생명주기

스프링 컨테이너 생성 => 스프링 빈 생성 => 사용 => 소멸

빈의 생명주기

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

지금까지 스프링 컨테이너 생성, 빈 생성, 의존관계 주입, 사용, 스프링 컨테이너 종료에 대해서는 알아보았는데 초기화 콜백과 소멸전 콜백 즉, 콜백에 대해서는 알아본 적이 없다.

실제로 우리가 콜백을 사용해야할 때 콜백을 어떻게 사용해야하는지 알아보자.

콜백을 이용할 수 있는 방법은 총 3가지인데 각각에 대해 알아보자


1. 인터페이스 (InitializingBean, DisposalBean)

첫번째는 InitializingBean 인터페이스와 DisposalBean 인터페이스를 상속받아 이를 구현하는 것이다.

다음 예시를 통해 살펴보자.

@Getter
@Setter
public class Employee implements InitializingBean, DisposableBean {
    private Long id;
    private String name;
    private String department;
    private String position;

    public Employee() {
    }

    public Employee(String name, String department, String position) {
        this.name = name;
        this.department = department;
        this.position = position;
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("(인터페이스)소멸!");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("(인터페이스)초기화!");
    }
}

public class callback {
    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(cb.class);

    @Test
    public void callback() throws Exception {
        ac.close();
    }

    @Configuration
    static class cb {
        @Bean
        public Employee employee() {
            return new Employee();
        }
    }
}

다음과 같이 초기화 콜백과 소멸전 콜백이 잘 불리는 것을 확인할 수 있다.


2. 메소드 (init(), destory())

다음은 메소드를 이용하는 것이다.

이는 클래스 내에 초기화 메소드와 소멸 메소드를 정의해준뒤에 빈 파라미터 initMethod에 정의한 초기화 메소드의 이름을 넣고 destroyMethod에 정의한 소멸 메소드의 이름을 정의해주면 된다.

@Getter
@Setter
public class Employee{
    private Long id;
    private String name;
    private String department;
    private String position;

    public Employee() {
    }

    public Employee(String name, String department, String position) {
        this.name = name;
        this.department = department;
        this.position = position;
    }

    public void destroy_bean() throws Exception {
        System.out.println("(메소드)소멸!");
    }

    public void init_bean() throws Exception {
        System.out.println("(메소드)초기화!");
    }
}

public class callback {
    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(cb.class);

    @Test
    public void callback() throws Exception {
        ac.close();
    }

    @Configuration
    static class cb {
        @Bean(initMethod = "init_bean", destroyMethod = "destroy_bean")
        public Employee employee() {
            return new Employee();
        }
    }
}

다음과 같이 초기화 콜백과 소멸전 콜백이 잘 불리는 것을 확인할 수 있다.


3. 어노테이션 (@PostConstruct, @PreDestroy)

다음은 어노테이션을 활용하는 것이다.

초기화 메소드를 정의하고 이에 @PostConstruct 어노테이션을 적용해주면 되고, 소멸 메소드를 정의하고 이에 @PreDestroy를 적용하면 된다.

@Getter
@Setter
public class Employee{
    private Long id;
    private String name;
    private String department;
    private String position;

    public Employee() {
    }

    public Employee(String name, String department, String position) {
        this.name = name;
        this.department = department;
        this.position = position;
    }

    @PreDestroy
    public void destroy_bean() throws Exception {
        System.out.println("(어노테이션) 소멸!");
    }

    @PostConstruct
    public void init_bean() throws Exception {
        System.out.println("(어노테이션) 초기화!");
    }
}

public class callback {
    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(cb.class);

    @Test
    public void callback() throws Exception {
        ac.close();
    }

    @Configuration
    static class cb {
        @Bean
        public Employee employee() {
            return new Employee();
        }
    }
}

다음과 같이 초기화 콜백과 소멸전 콜백이 잘 불리는 것을 확인할 수 있다.


이렇게 3가지 생명주기 콜백 방법에 대해서 알아보았다.

인터페이스를 활용하는 방법은 잘 사용하지 않고 주로 어노테이션을 활용한 방법을 자주 사용한다.

하지만, 코드를 고칠 수 없는 외부 라이브러리를 초기화 혹은 소멸해야한다면 추가적으로 메소드를 정의하고 이를 빈 설정으로 초기화 혹은 소멸을 적용해주는 메소드 방법을 사용하면 된다.

'스프링' 카테고리의 다른 글

RequestMapping  (0) 2021.09.20
MVC, Spring MVC  (0) 2021.09.18
같은 타입의 빈 등록(중복)  (0) 2021.09.16
수동 빈 등록, 자동 빈 등록  (2) 2021.09.15
스프링 컨테이너, 빈  (0) 2021.09.15