본문 바로가기
코딩 공부/web & Java

[Spring] @PostConstruct와 @PreDestroy

by 현장 2023. 10. 6.

@PostConstruct

PostConstruct 어노테이션은 초기화를 수행하기 위해 의존성 주입이 완료된 후 실행해야 하는 메서드에서 사용하며, 이 메서드는 클래스를 사용하기 전에 호출되어야 합니다. 다른 Bean이 이 Bean을 사용할 수 있게 되기 전에 이 메서드가 호출되며, 이때 애플리케이션이 실행되고 Bean이 로드됩니다.

@Component
class SomeClass {
    private SomeDependency someDependency;

    public SomeClass(SomeDependency someDependency) {
        super();
        this.someDependency = someDependency;
        System.out.println("All dependencies are ready!");
    }

    @PostConstruct
    public void initialize() {
        someDependency.getReady();
    }
}

@Component
class SomeDependency {

    public void getReady() {
        System.out.println("Some logic using SomeDependency");
    }
}

 

출력

All dependencies are ready!
Some logic using SomeDependency
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
prePostAnnotationsLuncherApplication
someClass

예를 들어 데이터베이스 등에서 데이터를 가져오려는 경우에 PostConstruct를 사용하여 이와 같이 의존성 준비 완료 후에 로직이 실행시킬 수 있습니다.

 

@PreDestroy

PreDestroy 어노테이션은 컨테이너에서 인스턴스를 삭제하는 과정 중에 있음을 알려주는 콜백 알림으로 메서드로 사용됩니다. 보통 유하고 있던 리소스를 해제하는 데 일반적으로 사용된다고 합니다.

 

즉, 애플리케이션이 종료되기 전에 컨텍스트에서 Bean이 삭제되기 전에 뭔가 해야 할 경우 사용합니다.

 

@Component
class SomeClass {
    private SomeDependency someDependency;

    public SomeClass(SomeDependency someDependency) {
        super();
        this.someDependency = someDependency;
        System.out.println("All dependencies are ready!");
    }

    @PostConstruct
    public void initialize() {
        someDependency.getReady();
    }

    @PreDestroy
    public void cleanup() {
        // 데이터 베이스 등에 연결 될 경우 종료를 위한 메소드
        System.out.println("Clean up!");
    }
}

@Component
class SomeDependency {

    public void getReady() {
        System.out.println("Some logic using SomeDependency");
    }
}

@Configuration
@ComponentScan
public class PrePostAnnotationsLuncherApplication {

    public static void main(String[] args) {
        try (var context =
                     new AnnotationConfigApplicationContext
                             (PrePostAnnotationsLuncherApplication.class))
        {
            Arrays.stream(context.getBeanDefinitionNames())
                    .forEach(System.out::println);
        }

    }
}

출력

All dependencies are ready!
Some logic using SomeDependency
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
prePostAnnotationsLuncherApplication
someClass
someDependency
Clean up!

예를 들어 데이터 베이스 등의 연결을 마지막에 종료를 해야하는 상황에서  PreDestroy  어노테이션을 사용하여 컨텍스트에서 Bean이 삭제되기 전에 실행시킬 수 있습니다.