빈의 생명주기 관련 코드 살펴보기

CJI0524·2025년 2월 10일

Spring Boot

목록 보기
7/21

1. 예제 코드를 통한 빈의 생명주기 관찰

이번 글에서는 예제 코드를 활용해서 빈의 생명주기를 관찰 할 것이다.

예제 코드는 다음과 같다.

✍️ 작성

public class MyBean implements InitializingBean, DisposableBean {

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

    @PostConstruct
    public void postConstruct() {
        System.out.println("@PostConstruct 메소드 호출");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("InitializingBean의 afterPropertiesSet 메소드 호출");
    }

    public void init() {
        System.out.println("사용자 정의 init 메소드 호출");
    }

    @PreDestroy
    public void preDestroy() {
        System.out.println("@PreDestroy 메소드 호출");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("DisposableBean의 destroy 메소드 호출");
    }

    public void cleanup() {
        System.out.println("사용자 정의 cleanup 메소드 호출");
    }
}

예제에 나타난 MyBean클래스는 스프링 컨테이너에 의해 빈으로 등록되고 사용되고 소멸하는 과정에서 해당 메서드들을 순서대로 실행한다. 각 메서드들을 하나하나 살펴보자.


2. 빈 초기화 단계

2.1. 생성자 호출

✍️ 작성

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

빈 객체를 생성할 때 제일 먼저 생성자가 호출된다. 이 시점에서는 아직 의존성 주입이 이루어지기 전이다.


2.2. @PostConstruct 메소드 호출

✍️ 작성

@PostConstruct
public void postConstruct() {
    System.out.println("@PostConstruct 메소드 호출");
}

의존성 주입이 완료된 후에, 초기화 전에 호출되며 자바 표준 어노테이션으로, 스프링 컨테이너가 모든 의존성 주입을 완료하면 자동으로 호출해준다.

보통 초기화 작업 중 꼭 필요한 준비 작업을 여기서 수행할 수 있다.


2.3. InitializingBean의 afterPropertiesSet() 호출

✍️ 작성

@Override
public void afterPropertiesSet() throws Exception {
    System.out.println("InitializingBean의 afterPropertiesSet 메소드 호출");
}

InitializingBean 인터페이스를 구현하면, 빈의 프로퍼티가 모두 설정된 후에 호출되는 콜백 메소드이다.

스프링이 빈의 프로퍼티를 주입한 후에 호출해서, 추가적인 초기화 작업을 할 수 있게 해준다.


2.4. 사용자 정의 초기화 메소드 (init) 호출

✍️ 작성

public void init() {
    System.out.println("사용자 정의 init 메소드 호출");
}

개발자가 직접 정의한 초기화 메소드로, 이 메소드는 보통 XML 설정이나 @Bean 어노테이션에서 initMethod = "init"처럼 명시적으로 지정했을 때 호출된다.

스프링은 위에서 언급한 콜백 메소드들 이후에 이 사용자 정의 메소드를 호출해서 추가 초기화 작업을 할 수 있게 해준다.


종합적으로 순서는 생성자 → @PostConstructafterPropertiesSet() → 사용자 정의 init 메소드 순으로 호출된다.


3. 빈 소멸 (파괴) 단계

3.1. @PreDestroy 메소드 호출

✍️ 작성

@PreDestroy
public void preDestroy() {
    System.out.println("@PreDestroy 메소드 호출");
}

빈이 소멸되기 전에 호출되어, 정리 (cleanup) 작업을 할 수 있게 해주는 메소드이다. 스프링 컨테이너가 종료되거나 빈을 제거하기 전에 호출되며 리소스 해제 같은 작업을 여기서 수행할 수 있다.


3.2. DisposableBean의 destroy() 호출

✍️ 작성

@Override
public void destroy() throws Exception {
    System.out.println("DisposableBean의 destroy 메소드 호출");
}

DisposableBean 인터페이스를 구현하면, 빈 소멸 전에 스프링이 호출해주는 메소드이다. 스프링이 빈을 파괴할 때 호출해서, 추가 정리 작업을 할 수 있게 해준다.


3.3. 사용자 정의 소멸 메소드 (cleanup) 호출

✍️ 작성

public void cleanup() {
    System.out.println("사용자 정의 cleanup 메소드 호출");
}

개발자가 직접 정의한 소멸 (cleanup) 메소드이다. 이 메소드는 @Bean 어노테이션에서 destroyMethod = "cleanup"으로 지정하면 호출된다.

스프링이 소멸 단계에서 위의 표준 메소드 호출 이후에 추가적으로 호출할 수 있도록 해준다.


종합적으로 순서는 @PreDestroyDisposableBean의 destroy() → 사용자 정의 destroy 메소드 (예: cleanup) 순으로 호출된다.

해당 코드들을 모두 살펴보았다. 예제 코드의 실행 결과는 다음과 같다.

✍️ 작성

MyBean 생성자 호출
@PostConstruct 메소드 호출
InitializingBean의 afterPropertiesSet 메소드 호출
사용자 정의 init 메소드 호출
2024-05-08T15:01:52.496+09:00 INFO 50535 ---[demo] [ main] com.example.my.MainApplication: Started MainApplication in 0.376 seconds (process running for 0.584)
@PreDestroy 메소드 호출
DisposableBean의 destroy 메소드 호출
사용자 정의 cleanup 메소드 호출

4. @Bean을 활용한 생명주기 설정

스프링 설정 파일 (@Configuration 클래스)에서 @Bean 어노테이션을 사용해서 빈을 등록할 때, 초기화와 소멸 시 호출할 메소드를 명시할 수 있다. 예를 들면 다음과 같다.

✍️ 작성

@Bean(initMethod = "init", destroyMethod = "cleanup")
public MyBean myBean() {
    return new MyBean();
}

1) initMethod = "init"

빈이 생성되고 필요한 의존성이 주입된 후, 스프링은 자동으로 myBean() 메소드로 등록된 MyBean 객체에서 init()라는 메소드를 찾아서 호출한다.

이는 위의 사용자 정의 초기화 메소드인 public void init()를 의미한다.

2) destroyMethod = "cleanup"

스프링 컨테이너가 종료되거나 빈을 소멸시킬 때, 자동으로 MyBean 객체에서 cleanup() 메소드를 호출한다.

이는 위의 사용자 정의 소멸 메소드인 public void cleanup()을 의미한다.


5. 해당 게시글 작성에 참고한 글 목록

멋쟁이 사자처럼 강의자료

profile
개발돌이

0개의 댓글