BackEnd/Spring

@PostConstruct, Static Block, Instance Block 초기화 시점 차이

PgmJUN 2024. 4. 13. 15:36

 

 

 

 

자바 스프링 기술로 개발을 해봤다면 @PostConstruct 과 Static block, Instance block 을 사용해본 경험이 있을 것이다.

이는 객체 초기화를 위한 콜백(callback) 함수를 선언하기 위한 기술이다.

 

 

콜백(Callback) 함수란?

콜백 함수는 다음과 같은 의미를 가진다.

  • 다른 함수 인자로서 사용되는 함수
  • 어떠한 이벤트에 의해 호출되는 함수
이 글에서의 설명은 2번째 의미인 '어떠한 이벤트에 의해 호출되는 함수' 에 가깝다.

 

 

본인또한 이 3가지를 종종 다루긴 했지만,

@PostConstructStatic block 중 어떤 것을 사용할 지 고민하던 중
이 두 가지의 초기화 시점 차이에 대해 정확히 인지하지 못한 채로 사용하고 있었다는 것을 깨닫게 되었다.

 

때문에 이를 공부하며 정리해보고자, 관련 내용에 대한 포스팅을 작성하게 되었다.

 

 


 

Static Block

  • static 키워드로 선언된 블록이며, 클래스가 처음으로 로드될 때 실행된다.
  • 클래스 로딩 시 한 번만 실행되며, 클래스 변수(static 변수)의 초기화나 클래스 수준의 작업을 수행할 수 있다.
  • 일반적으로 클래스 변수의 초기화에 사용된다.
  • 여러 개의 static 블록이 있다면, 선언된 순서대로 실행된다.
public class MyClass {
    static {
        // static block
        // 클래스가 로드될 때 실행됩니다.
        // 클래스 변수의 초기화 등에 사용됩니다.
    }
}

 

 


 

Instance Block

  • 인스턴스를 생성할 때마다 실행되는 블록이다.
  • 각 인스턴스마다 초기화 작업을 할 수 있다.
  • 생성자가 호출되기 전에 실행된다.
public class MyClass {
    {
        // instance block
        // 인스턴스를 생성할 때마다 실행됩니다.
        // 생성자가 호출되기 전에 실행됩니다.
    }
}

 

 


 

@PostConstruct

  • Spring 프레임워크에서 사용되는 어노테이션으로, 객체 생성 및 의존성 주입 후에 호출된다.
  • 주로 Spring Bean의 초기화 작업에 사용되며, Spring Bean의 생명주기 콜백 메서드를 정의하기 위해 사용된다.
  • 해당 객체의 모든 의존성이 주입된 후 호출된다.
  • @PostConstruct와 반대로 스프링 빈이 소멸되기 직전에 호출되는 @PreDestroy 라는 애노테이션도 존재한다.
public class MyClass {
    @PostConstruct
    void init() {
        // @PostConstruct annotated method
        // 객체 생성 및 의존성 주입 후 호출됩니다.
        // 주로 초기화 작업에 사용됩니다.
    }
}

 

 


정리

  • Static Block: 클래스가 로드될 때 실행되며, 한 번만 실행
  • Instance Block: 인스턴스가 생성될 때마다 실행되며, 생성자 호출 전에 실행
  • @PostConstruct: Spring Bean의 초기화 작업에 사용되며, 의존성 주입 후 호출

 

 

흐름에 따른, 각 콜백 함수 호출 시점

(Static Block 호출) -> 스프링 컨테이너 생성 -> 스프링 빈 생성(Instance Block 호출) -> 의존관계 주입 -> 초기화 콜백(@PostConstruct 호출) -> 빈 사용 -> 소멸전 콜백(@PreDestroy 호출) -> 스프링 종료

 

 

본인은 @PostConstruct와 Static Block의 차이가 크지 않을 줄 알았으나 이번 계기를 통해 내용을 정리하게 되면서

@PostConstruct는 클래스 로딩 시점에 사용되는 Static Block과는 별개로, 스프링 빈의 생명주기와 관련된 기술임을 깨닫게 되었다.

 

보통 객체 초기화 콜백 정의는 항상 @PostConstruct를 사용하곤 했는데, 앞으로는 상황에 맞게 사용할 수 있는 지식이 쌓인 것 같다고 느껴졌다.

 

혹시라도 정리된 내용 중 잘못 설명된 내용이 있다면 댓글 부탁드립니다!