반응형
얼마전 @PostConstruct에 대한 설명에 대해 헷갈려하시던 분이 생각나서 적어보는 글이다.
@PostConstruct는 조금만 검색해도 알 수 있듯이 서버가 올라갈 때 초기화 용도로 사용한다.
@PostConstruct
private void init() {
// 초기화 처리
}
@PostConstruct의 원문 설명
하지만 아래 Java 사이트에서 @PostConstruct에 대해 설명한 자료를 보고 해석을 하자면 이게 왜 초기화랑 관련 있는건지 이해가 안된다.
The PostConstruct annotation is used on a method that needs to be executed after dependency injection is done to perform any initialization.
"PostConstruct 어노테이션은 초기화를 수행하기 위해 의존성 주입이 완료된 후 실행해야 하는 메서드에 사용됩니다."
위와 같은 해석을 Java 진영에서 그걸 그대로 한국어로 번역해서 블로그에 쓰신 분들이 많기 때문에 더 헷갈릴거라고 생각한다. 물론 완전히 틀린 해석은 아니지만 저 문장 자체가 스프링 컨테이너 생명주기에 대한 이해가 덜 된 사람들한테 헷갈리게 다가올 수 있다는 것이다.
위의 번역을 아래처럼 표현해보자.
"PostConstruct 어노테이션은 초기화를 수행하기 위해 (스프링 컨테이너가) 의존성 주입(을 강제로 완료 시킨 후) 실행해야 하는 메서드에 사용됩니다."
바뀐 문장은 스프링 컨테이너가 주체적으로 실행시킨다는 문장이다.
의존성 주입은 보통 @Autowired나 생성자 주입을 통해 개발자가 아래처럼 의존성 주입하는 것을 의미한다.
@Autowired
TestRepository testRepository;
@PostConstruct를 적으면 위 과정을 서버가 올라갈 때 스프링 컨테이너가 대신 해주는 것을 말한다.
그럼 왜 의존성 주입을 해주고 초기화를 하는걸까?
@Autowired
TestRepository testRepository;
@PostConstruct
private void init() {
// 초기화 처리
testRepository.test();
}
위처럼 @PostConstruct가 붙은 init메소드가 서버가 올라갈 때 실행 되려면 내부 코드에서 testRepository를 사용해야 한다. 하지만 해당 코드를 사용하려면 의존성 주입(스프링 컨테이너가 생성해준 코드)이 끝난 상태여야 하기 때문에 스프링 컨테이너가 생성해주고 나서 실행된다는 의미(PostConstruct)를 비로소 이해를 할 수 있다.
728x90
'🍃 Spring' 카테고리의 다른 글
Spring Boot에서 Redis로 세션 클러스터링 구축 (4) | 2022.10.03 |
---|---|
gradle build bootJar 차이 (0) | 2022.09.23 |
Redirect와 Forward 차이점, 특징 및 실무 사용법 (0) | 2022.09.15 |
Spring과 Spring Boot의 예외 처리와 에러 페이지 처리 방식 (1) | 2022.07.30 |
Spring Boot에서 파일 저장을 위한 상대경로 getRealPath() 사용 금지 (0) | 2022.06.14 |