[Java] @PostConstruct

📌 개요

@PostConstruct는 의존성 주입(Dependency Injection)이 완료된 후 초기화를 수행하기 위해 사용된다.


🔑 주요 특징

  • 실행 시점: 의존성 주입이 완료된 직후, 빈(Bean)이 초기화될 때 자동으로 실행된다.
  • 호출 횟수: 빈 생명주기 동안 단 한 번만 실행된다.
  • 메소드 요구사항:
    • 반환 타입은 void여야 한다.
    • 매개변수를 가질 수 없다.
    • 예외를 던질 수 있다.

빈 생명 주기 (Bean LifeCycle)
스프링 컨테이너는 빈의 생성, 의존관계 주입, 초기화, 사용, 소멸의 과정을 관리한다.
@PostConstruct는 의존관계 주입 완료 후 초기화 단계에서 실행된다. 이는 빈이 완전히 생성되고 사용 가능한 상태가 되는 시점을 정확히 포착하여 필요한 설정을 수행할 수 있게 해준다.


⏳ 실행 순서

  1. 생성자 호출
  2. 의존성 주입 완료
  3. @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 완료)
  1. 생성자 실행:
    • 객체가 생성될 때 가장 먼저 생성자가 호출된다.
    • 이 시점에서는 아직 의존성 주입이 완료되지 않았으므로 testMappernull이다.
  2. 의존성 주입:
    • 생성자 호출 후, 스프링 컨테이너가 @Autowired로 지정된 testMapper에 대한 의존성을 주입한다.
  3. @PostConstruct 메소드 실행:
    • 의존성 주입이 완료된 후 @PostConstruct가 지정된 init() 메소드가 자동으로 호출된다.
    • 이 시점에서는 testMapper가 정상적으로 주입되어 있어 사용 가능하다.

참고

Tags:

Categories:

Updated:

Leave a comment