[Java] @PostConstruct
📌 개요
@PostConstruct는 의존성 주입(Dependency Injection)이 완료된 후 초기화를 수행하기 위해 사용된다.
🔑 주요 특징
- 실행 시점: 의존성 주입이 완료된 직후, 빈(Bean)이 초기화될 때 자동으로 실행된다.
- 호출 횟수: 빈 생명주기 동안 단 한 번만 실행된다.
- 메소드 요구사항:
- 반환 타입은 void여야 한다.
- 매개변수를 가질 수 없다.
- 예외를 던질 수 있다.
빈 생명 주기 (Bean LifeCycle)
스프링 컨테이너는 빈의 생성, 의존관계 주입, 초기화, 사용, 소멸의 과정을 관리한다.
@PostConstruct는 의존관계 주입 완료 후 초기화 단계에서 실행된다. 이는 빈이 완전히 생성되고 사용 가능한 상태가 되는 시점을 정확히 포착하여 필요한 설정을 수행할 수 있게 해준다.
⏳ 실행 순서
- 생성자 호출
- 의존성 주입 완료
@PostConstruct메소드 실행
💻 예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@Service
public class PostConstructTestService {
@Autowired
private TestMapper testMapper;
public PostConstructTestService() {
System.out.println("1. PostConstructTestService 생성자 호출");
try {
testMapper.getTest();
} catch (NullPointerException e) {
System.out.println("2. 생성자 내 testMapper는 null (DI 미완료)");
}
}
@PostConstruct
public void init() {
System.out.println("3. @PostConstruct 메소드 호출");
try {
testMapper.getTest();
System.out.println("4. testMapper 정상 작동 (DI 완료)");
} catch (Exception e) {
System.out.println("예외 발생: " + e.getMessage());
}
}
}
실행 결과
1
2
3
4
1. PostConstructTestService 생성자 호출
2. 생성자 내 testMapper는 null (DI 미완료)
3. @PostConstruct 메소드 호출
4. testMapper 정상 작동 (DI 완료)
- 생성자 실행:
- 객체가 생성될 때 가장 먼저 생성자가 호출된다.
- 이 시점에서는 아직 의존성 주입이 완료되지 않았으므로
testMapper는null이다.
- 의존성 주입:
- 생성자 호출 후, 스프링 컨테이너가
@Autowired로 지정된testMapper에 대한 의존성을 주입한다.
- 생성자 호출 후, 스프링 컨테이너가
- @PostConstruct 메소드 실행:
- 의존성 주입이 완료된 후
@PostConstruct가 지정된init()메소드가 자동으로 호출된다. - 이 시점에서는
testMapper가 정상적으로 주입되어 있어 사용 가능하다.
- 의존성 주입이 완료된 후
참고
Leave a comment