[Spring] 빈 생명주기 콜백

2025. 2. 19. 06:27코딩 도구/백엔드 개발 (Backend Development)

반응형

스프링 빈 생명주기 콜백

김영한님의 "스프링 핵심 원리 - 기본편"을 수강하고 정리했습니다. 

 

1. 빈 생명주기란?

스프링에서 관리하는 객체(빈)는 생성부터 소멸까지의 생명주기를 가진다. 특정 작업을 실행하기 위해 빈의 초기화 및 종료 시점에 특정 로직을 수행할 수 있도록 생명주기 콜백 기능을 제공한다.

2. 빈 생명주기 콜백 방식

1) @PostConstruct@PreDestroy 애노테이션 활용 (권장)

스프링이 제공하는 애노테이션을 활용하여 초기화 및 종료 작업을 수행할 수 있다.

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.springframework.stereotype.Component;

@Component
public class NetworkClient {
    private String url;

    public NetworkClient() {
        System.out.println("생성자 호출, url = " + url);
    }

    public void setUrl(String url) {
        this.url = url;
    }

    @PostConstruct
    public void init() {
        System.out.println("초기화 메서드 호출");
        connect();
        call("초기화 연결 메시지");
    }

    @PreDestroy
    public void close() {
        System.out.println("종료 메서드 호출");
        disconnect();
    }

    public void connect() {
        System.out.println("connect: " + url);
    }
    
    public void call(String message) {
        System.out.println("call: " + message);
    }
    
    public void disconnect() {
        System.out.println("disconnect: " + url);
    }
}

2) InitializingBean, DisposableBean 인터페이스 구현

스프링에서 제공하는 인터페이스를 활용할 수도 있다. 하지만, 스프링 전용 인터페이스에 의존하게 되어 권장되지 않는다.

import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.stereotype.Component;

@Component
public class NetworkClient implements InitializingBean, DisposableBean {
    private String url;

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("초기화 메서드 호출");
        connect();
        call("초기화 연결 메시지");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("종료 메서드 호출");
        disconnect();
    }
}

단점: 스프링 인터페이스를 직접 구현해야 하므로, 스프링 프레임워크에 종속된다.

3) @Bean(initMethod, destroyMethod) 활용

수동으로 빈을 등록할 경우, @Bean 애노테이션의 initMethoddestroyMethod 속성을 활용할 수 있다.

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

장점: 메서드 이름을 자유롭게 설정할 수 있다.

3. 실무에서 중요한 내용

1) DB 커넥션 풀, 네트워크 연결 등의 자원 관리 필요성

  • DB 커넥션 풀, 네트워크 연결 등의 자원을 초기화 및 종료할 때 반드시 활용해야 한다.
  • 자원을 미리 연결해두고 종료 시 적절히 해제하지 않으면 메모리 누수 및 성능 저하가 발생할 수 있다.

2) 스프링이 제공하는 생명주기 인터페이스 활용

  • 가장 권장되는 방법: @PostConstruct@PreDestroy 애노테이션을 활용하는 방식
  • @Bean(initMethod, destroyMethod)도 유용하지만, 애노테이션 방식이 더 간결함

4. 결론

스프링 빈의 생명주기 관리는 자원 관리를 위해 필수적인 요소다. @PostConstruct@PreDestroy를 활용하면 간결하고 유지보수하기 쉬운 코드를 작성할 수 있다. 필요에 따라 @Bean(initMethod, destroyMethod)를 활용할 수도 있지만, 인터페이스 구현 방식(InitializingBean, DisposableBean)은 지양하는 것이 좋다.

반응형