[Spring] 빈 생명주기 콜백

2025. 2. 26. 01:53·Spring

빈 생명주기 콜백


스프링에서 빈(Bean)의 생성부터 소멸까지 특정 동작을 수행하는 방법을 제공하는 기능

 

ex. 데이터베이스 커넥션 풀이나, 네트워크 소켓처럼 애플리케이션 시작 시점에 미리 필요한 연결을 해두고,

애플리케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면, 객체의 초기화와 종료 작업이 필요

 

빈 생명주기(Lifecycle)

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

 

*초기화 콜백: 빈이 생성되고, 빈의 의존관계 주입이 완료된 후 호출

 소멸전 콜백: 빈이 소멸되기 직전에 호출

 

참고 : 객체를 생성하는 부분과 초기화 하는 부분을 명확하게 나누는 것이 유지보수 관점에서 좋음

 

빈 생명주기 콜백 구현


1.  인터페이스(InitializingBean, DisposableBean) (비추천)

@Component
public class NetworkClient implements InitializingBean, DisposableBean {
    
    @Override
    public void afterPropertiesSet() { // 초기화 콜백
        System.out.println("NetworkClient 초기화");
    }

    @Override
    public void destroy() { // 소멸 콜백
        System.out.println("NetworkClient 소멸");
    }
}

 단점 : 스프링 전용 인터페이스에 의존하게 되어 유연성이 떨어짐

 

2.  @Bean(initMethod, destroyMethod)

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

초기화, 소멸 메서드 지정

public class NetworkClient {
    public void init() {
        System.out.println("NetworkClient 초기화 메서드 실행");
    }

    public void close() {
        System.out.println("NetworkClient 소멸 메서드 실행");
    }
}

코드가 아니라 설정 정보를 사용하기 때문에 코드를 고칠 수 없는 외부 라이브러리에도 초기화, 종료 메서드를 적용 가능

종료메서드 안써도 'close' , 'shutdown' 라는 이름의 메서드를 자동으로 호출해줌.

 

3. @PostConstruct, @PreDestroy (권장 ✅)

@Component
public class NetworkClient {
    
    @PostConstruct // 의존관계 주입 후 실행 (초기화 콜백)
    public void init() {
        System.out.println("NetworkClient 초기화");
    }

    @PreDestroy // 빈 소멸 직전에 실행 (소멸 콜백)
    public void close() {
        System.out.println("NetworkClient 소멸");
    }
}

 

장점 : 간결하고 가독성 높음, 스프링과 관계없는 표준 자바 애노테이션 → 유지보수 용이

유일한 단점은 외부 라이브러리에는 적용하지 못함 -> 외부 라이브러리를 초기화, 종료 해야 하면 @Bean의 기능을 사용하자.

 

 

예시.

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

 

public class BeanLifeCycle {
    @Test
    public void lifeCycleTest() {
        ConfigurableApplicationContext ac = new AnnotationConfigApplicationContext(LifeCycleConfig.class);
        NetworkClient client = ac.getBean(NetworkClient.class);
        ac.close(); //스프링 컨테이너를 종료, ConfigurableApplicationContext 필요
    }

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

1. AnnotationConfigApplicationContext(LifeCycleConfig.class)을 통해 스프링 컨테이너 생성

     LifeCycleConfig.class 설정 클래스를 읽어서 Bean 등록 시작

2. NetworkClient() 생성자 실행

3. setUrl("http://hello-spring.dev") 실행 (의존성 주입)

4. 빈 생성 완료 (스프링 컨테이너에 등록)

5. 초기화 콜백 실행 (@PostConstruct)

6. 스프링 컨테이너 사용 (빈 사용)

NetworkClient client = ac.getBean(NetworkClient.class);

7. 스프링 컨테이너 종료 (ac.close())

8.8️⃣ 소멸 콜백 실행 (@PreDestroy)

 

 

  1. 초기화 작업이 필요한 경우
    • DB 연결, 네트워크 소켓 연결, 캐시 로딩 등
  2. 소멸 전 정리 작업이 필요한 경우
    • DB 연결 해제, 네트워크 종료, 리소스 반환 등

'Spring' 카테고리의 다른 글

[Spring] HTTP(1)  (0) 2025.02.28
[Spring] 빈 스코프  (0) 2025.02.27
[Spring] 의존관계 자동 주입  (0) 2025.02.24
[Spring] 컴포넌트 스캔  (0) 2025.02.21
[Spring] 싱글톤 컨테이너  (0) 2025.02.19
'Spring' 카테고리의 다른 글
  • [Spring] HTTP(1)
  • [Spring] 빈 스코프
  • [Spring] 의존관계 자동 주입
  • [Spring] 컴포넌트 스캔
Naah
Naah
  • Naah
    blueprint
    Naah
  • 전체
    오늘
    어제
    • 분류 전체보기 (106)
      • Java (28)
      • Kotlin (0)
      • TypeScript (7)
      • React (22)
      • Next.js (1)
      • Spring (22)
      • JPA (12)
      • Spring Data JPA (6)
      • Querydsl (1)
      • Error (7)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
    • manage
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Naah
[Spring] 빈 생명주기 콜백
상단으로

티스토리툴바