서론
매번 스프링 설정을 할 때 까먹는 것 같아 정리를 해둠.
위 어노테이션은 jakarta.annotation API에 이미 작성이 되어있으므로 우리는 가져다가 사용만 하면된다.
자세한 내용 및 내부구현은 레퍼런스 문서를 보면 알 수 있다.
본론
@PostConstruct 는 서버가 실행될 때 빈으로 등록되 있는 인스턴스를 스프링 컨텍스트에 올려 초기화를 진행할 때,
위 어노테이션이 붙어 있는 메소드를 호출한다. 그리고 메소드에 등록되 있는 어떠한 작업을 실행한다.
@Component
public class DBClear {
@Autowired
private UserRepository userRepository;
@PostConstruct
private void postConstruct() {
User user = new User();
userRepository.delete(user);
}
}
위 로직은 DBClear 객체가 빈으로 등록이 될 때 @PostConstruct 가 등록된 메소드를 호출하여
User 테이블을 다 삭제하는 로직 입니다.
즉 서버가 실행될 때 내가 원하는 어떠한 작업을 선작업 해두고 싶을 때 사용해야 합니다.
ex) 캐시 초기화, 빈 객체 내부 상태 초기화, db로부터 데이터 로드
@PreDestory 는 서버가 종료될 때 스프링 컨텍스트에 등록되 있는 빈을 제거할 때 위 어노테이션이 붙어있는 메소드를 호출 합니다.
@Component
public class UserRepository {
private DbConnection dbConnection;
@PreDestroy
public void preDestroy() {
dbConnection.close();
}
}
위 코드는 서버가 종료될 때 @PreDestory 어노테이션이 붙어 있으므로 db 연결을 끊어 달라는 후처리 메소드 입니다.
ex) db 연결해제, 캐시 저장, 빈 객체 내부 상태 정리
참고로 서버가 종료될 때 후처리를 할 수 있는 다른 방법또한 있습니다.
방식 | 장점 | 단점 |
@PreDestroy 어노테이션 | 코드 간 결합 느슨하게 유지, 테스트 용이성 향상 | |
predestroy() 메서드 | XML 설정 파일에서 직접 정의 가능(요즘은 잘 안씀) | 코드 가독성 저하 가능성, 테스트 어려움 |
결론
@PostConstruct:
서버가 켜질 때 스프링 컨텍스트가 초기화 될 때 @PostConstruct 어노테이션을 찾아서 어떠한 선 작업을 해준다.
@PreDestory
서버를 종료할 때 스프링 컨텍스트에 등록된 빈을 없앨 때 위 어노테이션이 붙어 있으면 빈 을 없애기 전에 어떠한 작업을 한다.
어노테이션 | 역할 | 사용 시점 | 활용 예시 |
@PostConstruct | 빈 객체 초기화 | 빈 객체 생성 및 의존성 주입 후 즉시 실행 | 외부 데이터 로드, 캐시 초기화, 객체 상태 초기화 |
@PreDestroy | 빈 객체 소멸 | 빈 객체 소멸 직전 마지막으로 실행 | 리소스 해제, 캐시 저장, 객체 상태 정리 |
Predestory 는 어노테이션 말고도 Spring 에서 제공하는 predestroy() 메서드를 사용하여
빈 객체의 소멸 과정에서 수행할 작업을 정의할 수 있음.
ref: Spring PostConstruct and PreDestroy Annotations | Baeldung