0+ 스프링/0+ 스프링 Core

[스프링 Core] 스프링 빈 초기화(@PostConstruct, @PreDestroy)

힘들면힘을내는쿼카 2023. 6. 8. 13:40
728x90
반응형

[스프링 Core] 스프링 빈 초기화(@PostConstruct, @PreDestroy)

 

우리는 스프링 빈을 등록하고 초기화 해야하는 작업을 해야할 때가 있습니다.

객체를 생성할 때 초기화하면 되지 않나? 🤔 라고 생각할 수 있습니다.
하지만, 객체를 생성하는 생성자와 초기화 작업은 분리하는 것이 좋습니다.

 

그렇다면 어떻게 스프링 빈을 초기화할 수 있을까요?

 

참고
생성자 안에서 상대적으로 무거운 초기화 작업을 함께 하는 것보다는 객체를 생성하는 부분과 초기화 하는 부분을 명확하게 나누어 관리하는 것이 유지보수에도 좋습니다.

 

스프링 빈 생명주기  🌱

먼저 스프링 빈의 생명주기에 대해서 알아야 합니다.

 

스프링 빈은 아래와 같은 생명주기를 갖고 있습니다.

객체 생성 -> 의존관계 주입 -> (데이터 사용 가능)

 

스프링 빈은 객체를 생성하고, 의존관계 주입이 다 끝난 다음에야
필요한 데이터를 사용할 수 있는 준비가 완료됩니다.

 

그런데 개발자가 의존관계 주입이 완료된 시점을 어떻게 알 수 있을까요?

스프링은 의존관계 주입이 완료되면 스프링 빈 콜백 메서드를 통해서 초기화 시점을 알려주는 다양한 기능을 제공합니다.

 

싱글톤 전략일 경우 스프링 빈의 이벤트 생명주기

1. 스프링 컨테이너 생성
2. 스프링 빈 생성
3. 의존관계 주입
4. 초기화 콜백
5. 사용
6. 소멸전 콜백
7. 스프링 종료

 

초기화 콜백빈이 생성되고, 빈의 의존관계 주입이 완료된 후 호출 됩니다.

소멸전 콜백빈이 소멸되기 직전에 호출 됩니다.

 

스프링 빈 초기화 콜백, 소멸전 콜백 예제(@PostConstruct, @PreDestroy)

Restaurant

public class Restaurant {
    private String status;

    public Restaurant() {
        System.out.println("생성자 호출.. 가게상태="+status);
    }

    @PostConstruct
    public void init() {
        System.out.println("초기화 콜백.. 가게상태="+getStatus());
    }

    @PreDestroy
    public void close() {
        setStatus("가게 마감");
        System.out.println("소멸전 콜백.. 가게상태="+getStatus());
    }

    public void setStatus(String message) {
        this.status = message;
    }

    public String getStatus() {
        return status;
    }
}

 

BeanLifeCycleTest

public class BeanLifeCycleTest {

    @Test
    @DisplayName("빈 라이프사이클")
    void beanLifeCycle() {
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(LifCycleConfig.class);
        Restaurant client = ac.getBean(Restaurant.class);
        ac.close();
    }

    @Configuration
    static class LifCycleConfig {

        @Bean
        public Restaurant restaurant() {
            Restaurant restaurant = new Restaurant();
            restaurant.setStatus("가게 오픈");
            return restaurant;
        }
    }
}

 

결과

 

참고

 

스프링 핵심 원리 - 기본편 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com

 

 

 

728x90
반응형