@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 빈이 제거 되기 전에 안전하게 데이터베이스 연결을 끊을 수 있습니다.
참고자료
'Spring Framework > Spring' 카테고리의 다른 글
Spring Annotation과 Meta Annotation 이해하기 - 어노테이션 활용법 (0) | 2024.11.21 |
---|---|
Spring AttributeConverter로 엔티티와 DB 컬럼 간 데이터 변환하기 - 엔티티와 DB 컬럼 매핑 (0) | 2024.11.16 |
[Spring] Optional 주요 메서드 활용법 - map, orElse, orElseGet, isPresent, ifPresent (0) | 2024.11.10 |
Java HashMap vs LinkedHashMap 차이점 - 스프링에서 데이터 삽입 순서 유지하기 (1) | 2024.11.09 |
Spring 정렬 Sort, Order 클래스 이해하기 - 정렬 방향, 속성 접근하기 (0) | 2024.11.08 |