![[Spring] @PostConstruct 호출 순서](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9x4v5%2FbtsmQf9bGyV%2FHlAeWPMDGDajJekOJcwlb0%2Fimg.png)
[Spring] @PostConstruct 호출 순서legacy/Spring2023. 7. 8. 10:35
Table of Contents
@PostConstruct가 뭐야?
의존성 주입(DI)이 완료된 후 호출되어야 하는 메서드에 사용하는 애너테이션이다.
예를 들어 로컬환경에서 테스트할 때, 매번 같은 행동(ex. 가입된 사용자)을 반복할 필요 없이 @PostConstruct가 붙은 메서드에 반복되는 코드를 작성하면 된다.
@PostConstruct 호출 순서
- 생성자 호출
- 의존성 주입
- @PostConstruct 메서드 호출
다음은 실제로 호출되는 과정이다.
Repository
@Repository
@Slf4j
public class UserRepository {
private Map<Long, User> stored = new HashMap<>();
private static Long sequence = 0L;
public UserRepository(Map<Long, User> stored) {
log.info("UserRepository 생성자 호출");
this.stored = stored;
}
public User save(User user) {
user.setId(++sequence);
stored.put(user.getId(), user);
return user;
}
}
테스트 클래스
@Slf4j
@SpringBootTest
public class PostConstructTest {
private final UserRepository userRepository;
@Autowired
public PostConstructTest(UserRepository userRepository) {
log.info("UserRepository DI 호출");
this.userRepository = userRepository;
}
@PostConstruct
void postConstruct() {
log.info("PostConstruct 호출");
}
@Test
void postConstructCallTest() {
}
}
UserRepository의 생성자, 테스트 클래스의 생성자 그리고 @PostConstruct 애너테이션 세 가지를 집중해서 보자.
UserRepostory는 애너테이션에 의해 자동으로 스프링 빈에 등록되었다. 테스트 클래스에서 스프링 컨테이너에서 UserRepository를 가져와 DI를 해주어야 하므로 @SpringBootTest 애너테이션을 사용해야 한다.
결과
스프링 빈에 등록된 클래스의 생성자를 먼저 호출하고 DI 주입 후 @PostConstruct가 호출됨을 알 수 있다.