Spring에서는 클래스가 생성된 후 딱 한 번만 실행되는 초기화 코드를 작성할 때, 생성자와 @PostConstruct를 많이 사용합니다.
하지만, 이 두 방식은 실행 시점과 목적이 다르기 때문에, 언제 어떤 것을 사용해야 하는지 이해하는 것이 중요합니다.
생성자와 @PostConstruct의 차이와 사용 시점을 비교해보겠습니다.
01. 기본 생성자에서 super() 호출
@Service
public class MyService {
public MyService() {
super(); // 부모 클래스의 기본 생성자 호출
System.out.println("생성자 호출");
}
}
- Java는 기본적으로 자식 클래스의 생성자에서 super()를 명시하지 않아도 자동으로 호출
- 그래서 기본 생성자에선 super();는 생략 가능
- 생성자는 객체가 생성될 때 실행
- 부모 클래스에 기본 생성자가 없고, 매개 변수를 요구하는 생성자만 존재한다면, 반드시 super(인자) 형태로 명시적으로 호출해야 하며, 그렇지 않다면 컴파일 에러 발생
02. @PostConstruct 를 활용한 초기화
@Service
public class MyService {
public MyService() {
System.out.println("생성자 호출");
}
@PostConstruct
public void init() {
System.out.println("PostConstruct 메서드 호출");
}
}
- 빈이 생성된 후, 즉 의존성 주입이 완료된 후 한번만 실행됨
- 메서드는 반환값이 void이고 매개변수가 없어야 하며, 한 클래스에 하나만 사용해야 함
- 주로 초기 설정, 데이터 로딩, 초기 로그 출력 등에 사용
- Spring이 알아서 자동 호출하므로, 직접 호출할 필요 없음
03. 생성자 VS @PostConstruct 비교
구분 | 생성자 | @PostConstruct |
실행 시점 | ▪️빈 생성 시 바로 실행 | ▪️ 빈 생성 후 의존성 주입 완료 후 실행 |
DI 의존성 주입 여부 | ▪️ 주입되기 전 | ▪️ 주입 완료 후 |
용도 | ▪️ 필수 파라미터 설정, 객체 기본값 초기화 등 | ▪️ 외부 의존 객체에 의존하는 초기화 로직 |
제약 | ▪️ 오버로딩 가능, 매개변수 사용 가능 | ▪️ void 반환, 매개변수 없음, 1개만 사용 |
적합한 상황 | ▪️ 단순 내부 초기화 | ▪️ Spring 컨텍스트와 관련된 작업에 더 적합 (예 : @Autowired 된 빈 사용) |
🖊️ 마무리 요약
단순 내부 초기화만 필요하다면 → 생성자
@Autowired, @Value 등 DI가 필요한 작업이 있다면 → @PostConstruct
댓글