@PostConstruct
Spring calls the methods annotated with @PostConstruct only once, just after the initialization of bean properties.
스프링은 @PostConstruct가 붙은 메서드를 빈 속성 초기화 이후에 단 한 번 호출합니다.
The method annotated with @PostConstruct can have any access level, but it can’t be static.
@PostConstruct가 붙은 메서드는 static으로 선언될 수 없습니다.
초기화 작업을 하므로, 정적 메서드로 선언될 수 없다.
@Component
public class DbInit {
@Autowired
private UserRepository userRepository;
@PostConstruct
private void postConstruct() {
User admin = new User("admin", "admin password");
User normalUser = new User("user", "user password");
userRepository.save(admin, normalUser);
}
}
- UserRepository 클래스가 초기화된 후에 @PostConstruct가 붙은 메서드가 초기화됩니다.
@Value, @PostConstrcut
빈의 생성 순서와 초기화 시점 알아보기
- 빈의 인스턴스가 생성됩니다.
- 의존성 주입 (@Autowired, @Value 등으로 주입된 값)
- 초기화 단계 (@PostConstruct)
@Value로 주입된 값은 의존성 주입 단계에서 설정됩니다. 해당 값이 주입되기 전에 사용하면 값을 올바르게 불러오지 못합니다.
@Value로 설정한 값을 Map 객체에 초기화하는 경우
@Value로 불러온 값을 Map 객체에 사용하기 위해서는 값이 확실히 주입된 후에 초기화 작업을 진행해야 합니다.
이러한 작업은 @PostConstruct 어노테이션을 이용해 빈 초기화가 된 다음 시점에 초기화 작업을 진행할 수 있습니다.
@Component
public class MyComponent {
@Value("${app.config.key1}")
private String key1;
@Value("${app.config.key2}")
private String key2;
private final Map<String, String> configMap = new HashMap<>();
@PostConstruct
public void init() {
configMap.put("key1", key1);
configMap.put("key2", key2);
}
}
@PreDestroy
A method annotated with @PreDestroy runs only once, just before Spring removes our bean from the application context.
@PreDestroy 어노테이션은 애플리케이션 컨텍스트에 올라온 스프링 빈이 제거되기 전에 특정 메서드를 실행할 수 있게 해 줍니다.
마찬가지로, static method로 선언될 수 없습니다.
@Component
public class UserRepository {
private DbConnection dbConnection;
@PreDestroy
public void preDestroy() {
dbConnection.close();
}
}
위 코드처럼 UserRepository 빈이 제거 되기 전에 안전하게 데이터베이스 연결을 끊을 수 있습니다.