자바 스프링 기술로 개발을 해봤다면 @PostConstruct 과 Static block, Instance block 을 사용해본 경험이 있을 것이다.
이는 객체 초기화를 위한 콜백(callback) 함수를 선언하기 위한 기술이다.
콜백(Callback) 함수란?
콜백 함수는 다음과 같은 의미를 가진다.
- 다른 함수 인자로서 사용되는 함수
- 어떠한 이벤트에 의해 호출되는 함수
이 글에서의 설명은 2번째 의미인 '어떠한 이벤트에 의해 호출되는 함수' 에 가깝다.
본인또한 이 3가지를 종종 다루긴 했지만,
@PostConstruct 와 Static 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를 사용하곤 했는데, 앞으로는 상황에 맞게 사용할 수 있는 지식이 쌓인 것 같다고 느껴졌다.
혹시라도 정리된 내용 중 잘못 설명된 내용이 있다면 댓글 부탁드립니다!
'BackEnd > Spring' 카테고리의 다른 글
내 테스트 코드는 제대로 작성되었을까? (with. 코드 커버리지) (0) | 2024.06.19 |
---|---|
Bucket4j를 사용해서 스프링부트 트래픽 제한하기 (0) | 2024.06.18 |
의존성 주입 시, 같은 Type의 빈이 2개 이상일 경우 (1) | 2024.04.13 |
컴포넌트 스캔(ComponentScan) (1) | 2024.04.12 |
@Configuration과 싱글톤 (with. CGLIB) (0) | 2024.04.11 |