Post

[Spring] 빈 생명주기 관리 _ @PostConstruct & @PreDestroy

자원의 활당과 해제, 초기화와 소멸을 자동화하여 개발자가 수동으로 관리해야 하는 부담을 줄이고 애플리케이션의 관리와 유지보수를 용이하게 하기 위해 @PostConstruct@PreDestroy 어노테이션을 사용하여 객체의 생명주기 관리를 보다 효율적으로 할 수 있다.

스프링 빈의 이벤트 사이클 (Event Cycle)

빈 정의 및 등록

  • 먼저, 스프링 컨테이너는 구성 파일(XML)이나 어노테이션을 통해 빈의 정의를 읽는다.
  • 이 정의에는 빈의 클래스 타입, 생명 주기 범위, 의존성 등이 포함된다.

➡️ 빈 인스턴스화

  • 스프링 컨테이너는 빈의 정의에 따라 클래스의 인스턴스를 생성한다.

➡️ 의존성 주입 (Dependency Injection)

  • 빈 인스턴스가 생성된 후, 스프링은 해당 빈의 의존성을 주입한다.
  • 이는 생성자 주입, 세터 메소드 주입 등 다양한 방식으로 이루어질 수 있다.

➡️ 빈 초기화 콜백

  • 의존성 주입이 완료된 후, 빈은 초기화 된다.
  • 이때 @PostConstruct 어노테이션이 적용된 메소드가 호출되거나, ‘InitializingBean’인터페이스의 ‘afterPropertiesSet()’메소드가 실행된다.

➡️ 빈 사용

  • 초기화 완료된 빈은 애플리케이션에서 사용된다.

➡️ 빈 소멸 콜백

  • 애플리케이션 종료 시 또는 빈이 더 이상 필요 없을 때, 빈은 소멸된다.
  • 이때 @PreDestroy 어노테이션이 적용된 메소드가 호출되거나, ‘DisposableBean’인터페이스의 ‘destroy()’ 메소드가 실행된다.

@PostConstruct

해당 어노테이션은 빈의 초기화를 위해서 사용한다. 스프링 컨테이너가 모든 필수 속성을 설정하고 나서 바로 실행되는 메소드에 붙인다. 이 메소드는 빈이 생성되고 의존성 주입이 완료된 후 한 번만 호출된다. 즉, 빈이 작업을 시작하기 전에 필요한 자원을 설정하거나 초기화하는 데 사용된다.

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

    @PostConstruct
    public void init() {
        // 초기화 로직
        System.out.println("MyService가 초기화됩니다.");
        // 예: 데이터베이스 연결 설정 등
    }

    // 서비스 로직
    public void performService() {
        System.out.println("서비스가 수행됩니다.");
        // 서비스 관련 주요 로직
    }
}

사용 이유

  • 객체 생성 후 초기화 작업을 자동화하고자 할 때 사용한다. 예를 들어, 데이터베이스 연결을 설정하거나, 필요한 자원을 로드하는 등의 작업을 객체 생성 직후에 자동으로 수행할 수 있다.
  • 이 어노테이션을 사용하면 개발자가 별도의 초기화 코드를 작성할 필요 없이, 스프링 프레임워크가 객체 생성 후 자동으로 해당 메소드를 호출 해준다.
  • 이는 코드의 가독성을 높이고, 초기화 로직을 한 곳에 집중시켜 관리하기 쉽게 만들어 준다.

@PreDestroy

해당 어노테이션은 빈의 소멸 전에 사용된다. 스프링 컨테이너가 종료되기 전에 실행되는 메소드에 붙인다. 이 메소드는 빈이 제거되기 전에 호출되며, 주로 사용된 자원을 정리하고 해제하는데 사용된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Component
public class MyService {
    // 서비스 로직
    public void performService() {
        System.out.println("서비스가 수행됩니다.");
        // 서비스 관련 주요 로직
    }

    // @PreDestroy 어노테이션이 적용된 메소드
    @PreDestroy
    public void cleanup() {
        // 정리 로직
        System.out.println("MyService가 정리됩니다.");
        // 예: 데이터베이스 연결 해제, 자원 해제 등
    }
}

사용 이유

  • 객체가 소멸되기 전에 정리 작업을 자동화하고자 할 때 사용한다. 예를 들어, 열려 있는 파일 핸들을 닫거나, 네트워크 연결을 해제하는 등의 자원 정리 작업을 수행할 수 있다.
  • 스프링 컨테이너가 종료되기 전에 자동으로 해당 메소드를 호출해 주므로, 개발자가 소멸 로직을 직접 관리핦 필요가 없다.
  • 이는 자원 누수를 방지하고, 애플리케이션이 안정적으로 종료될 수 있도록 도와준다.
This post is licensed under CC BY 4.0 by the author.

© chanho. Some rights reserved.