[Spring] @PostConstruct @PreDestory 이해하기

728x90

서론 

매번 스프링 설정을 할 때 까먹는 것 같아 정리를 해둠.

위 어노테이션은 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

728x90