백엔드/Spring

@PostConstruct란?

manchesterandthecity 2025. 4. 30. 16:55

🧷 @PostConstruct란? - 스프링 빈 생성 이후 초기화 로직 실행

스프링 기반 애플리케이션을 개발하다 보면, 빈이 생성된 직후 한 번만 실행되어야 하는 초기화 작업이 필요할 때가 있습니다.

이럴 때 사용할 수 있는 간단하고 강력한 도구가 바로 @PostConstruct 어노테이션입니다.


✅ @PostConstruct란?

  • Java에서 제공하는 표준 애노테이션(JSR-250)
  • 스프링 빈이 생성된 직후(의존성 주입 완료 후)에 실행할 초기화 메서드에 붙입니다.
  • 별도의 XML 설정 없이, 메서드에 어노테이션만 붙이면 자동 호출됩니다.

🛠 사용 예제

@Component
public class SampleService {

    @PostConstruct
    public void init() {
        System.out.println("SampleService 초기화 완료!");
    }
}

실행 흐름

  1. SampleService 빈 생성됨
  2. 생성자 실행됨
  3. 의존성 주입 완료됨
  4. @PostConstruct가 붙은 init() 메서드 실행됨 ✅

🔄 왜 쓰는 걸까?

  • 생성자에서는 의존성 주입이 완료되지 않았기 때문에, 초기화 코드를 넣기 어려움
  • 빈이 준비된 이후 실행해야 하는 코드 (ex: 캐시 로딩, 외부 API 호출, 로그 등)는 @PostConstruct가 적합

⛔ 주의사항

항목 설명
매개변수 없음 @PostConstruct 메서드는 반드시 파라미터가 없어야 합니다
반환값 없음 void 타입이어야 함
한 번만 실행 스프링이 빈을 초기화할 때 딱 한 번만 호출
메서드는 한 개 권장 여러 개 있어도 되지만, 복잡성 증가로 인해 1개만 사용하는 것이 일반적

🔁 @PostConstruct vs InitializingBean.afterPropertiesSet()

항목 @PostConstruct InitializingBean
선언 방식 어노테이션 기반 인터페이스 구현 기반
구현 부담 적음 높음 (의존성 생김)
스프링 의존도 낮음 (자바 표준) 높음 (Spring 인터페이스)
추천 여부 ✅ 일반적으로 권장 ❌ 특별한 경우에만 사용

⚙️ 언제 사용하면 좋을까?

  • DB에서 설정 값을 미리 로드하고 싶은 경우
  • 외부 API에서 데이터를 미리 가져와야 할 경우
  • 정적 리소스를 초기화할 경우
  • 한 번만 수행돼야 할 초기화 로직이 있을 때

🔄 자주 묻는 질문

❓ 생성자랑 뭐가 다른가요?

  • 생성자는 의존성 주입이 완료되기 전에 실행됩니다.
    → 따라서 @Autowired된 필드는 아직 null일 수 있어요.
  • @PostConstruct는 모든 주입이 끝난 직후 실행되므로, 안정적인 초기화가 가능합니다.

✅ 정리

항목 설명
목적 스프링 빈 초기화 후 한 번 실행될 로직 작성
실행 시점 의존성 주입 완료 후
제한 파라미터 없음, 반환값 없음 (void)
대안 InitializingBean, @Bean(initMethod="...") 등
추천 여부 일반적인 경우엔 @PostConstruct가 가장 간편하고 명확함 ✅

📌 보너스: Spring 6+ / Jakarta 전환 관련

Spring 6부터는 @PostConstruct가 Jakarta 패키지로 이전됨:

import jakarta.annotation.PostConstruct;

 

기존 코드에서 javax.annotation.PostConstruct를 사용 중이라면 Jakarta EE로 마이그레이션이 필요할 수 있습니다.