백엔드/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 초기화 완료!");
}
}
실행 흐름
- SampleService 빈 생성됨
- 생성자 실행됨
- 의존성 주입 완료됨
- @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로 마이그레이션이 필요할 수 있습니다.