Updated:

1. 개요

빈 생명주기 콜백을 이용하면 빈을 생성하여 의존관계를 주입하고 실제로 사용하기 전, 빈의 사용이 끝나고 소멸시키기 전 이렇게 두 가지 경우에 원하는 동작을 하도록 구현할 수 있다. DB의 경우를 예로들면 DB를 사용하기 전 커넥션을 맺고, 사용이 끝나면 커넥션을 종료시킬 수 있다. 이번에는 빈 생명주기 콜백에 대해 알아보도록 하자.

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

2. 인터페이스 이용

InitializingBean 인터페이스의 afterPropertiesSet()를 구현하여 초기화 콜백, DisposableBean 인터페이스의 destroy()를 구현하여 소멸전 콜백을 이용할 수 있다. 메서드의 이름을 변경할 수 없고, 외부 라이브러리에 적용할 수 없다는 단점이 있다.

[DBService.java]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Service;

@Service
public class DBService implements InitializingBean, DisposableBean {

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

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("afterPropertiesSet() 호출");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("destroy() 호출");
    }
}

[실행 결과]

3. 설정파일 이용

스프링 설정 파일을 이용하여 빈 등록 시, initMethod, destroyMethod 속성을 이용하여 초기화, 소멸전 콜백을 이용할 수 있다. 메서드 이름을 원하는대로 변경할 수 있고, 코드의 변경없이 설정 파일로 초기화, 소멸전 콜백을 적용할 수 있고, 외부 라이브러리에도 적용 가능하다.

[DBService.java]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class DBService {

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

    public void init() {
        System.out.println("init() 호출");
    }

    public void destroy() {
        System.out.println("destroy() 호출");
    }
}

[AppConfig.java]

1
2
3
4
5
6
7
8
9
10
11
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

    @Bean(initMethod = "init", destroyMethod = "destroy")
    public DBService dbService() {
        return new DBService();
    }
}

[실행 결과]

4. Annotation 이용

@PostConstruct, @PreDestroy를 이용하여 초기화, 소멸전 콜백을 이용할 수 있고, 스프링에서 권장하는 방법으로 가장 편리하게 사용할 수 있는 방법이다. 외부 라이브러리에는 적용하지 못한다는 단점이 있는데, 외부 라이브러리는 설정파일 이용방식을 이용하자.

[DBService.java]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Service
public class DBService {

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

    @PostConstruct
    public void init() {
        System.out.println("init() 호출");
    }

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

[실행 결과]

Updated:

Leave a comment