ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 빈 생명주기 콜백
    스프링/스프링 기본이론 2023. 2. 1. 22:28

    스프링 빈의 라이프 사이클 (생성자 주입 등 몇 개는 제외)

    객체 생성 -> 의존관계 주입

     

     

    스프링 빈은 객체를 생성하고 의존관계 주입이 다 끝나고나서 필요한 데이터를 사용할 준비가 된다. 개발자는 자동 의존관계 주입을 했을 때 의존관계 주입이 끝나는 시점을 모르기때문에 스프링은 의존관계 주입이 완료되면 스프링 빈에게 콜백 메서드를 통해서 초기화 시점을 알려주는 기능을 제공한다.

    또한, 스프링은 스프링 컨테이너가 종료되기 직전에 소멸 콜백을 준다.

     

     

    스프링 빈의 이벤트 라이플사이클

    스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백 -> 사용 -> 소멸전 콜백 -> 스프링 종료

     

     

    초기화 콜백 : 빈이 생성되고 빈의 의존관계 주입이 완료된 후 호출

    소멸전 콜백 : 빈이 소멸되기 직전에 호출

     

     

     

    생성자 주입을 하지않는 이유

    생성자 주입을 통해 초기화를 하면 이런 방법이 필요없다고 생각할 수 있는데, 객체의 생성과 초기화는 분리하는 것이 좋다. 생성자는 메모리를 할당해서 객체를 생성하고, 초기화는 외부 커넥션을 연결하는 등 무거운 동작을 수행하기 때문에 유지보수 관점에서 훨씬 좋다.

     

    생성자는 객체 내부의 값을 세팅하는 정도로만 사용하는 것이 좋다.

     

     

     

     

    @PostConstruct, @PreDestroy

    빈 생명주기 콜백에서 가장 많이 사용하는 방법이다.

     

    @PostConstruct - 생성되기 전에

    @PreDestory - 소멸되기 전에

     

    public class NetworkClient {
        ....
        @PostConstruct
        public void init() throws Exception {
            System.out.println("NetworkClient.init");
            connect();
            call("초기화 연결 메시지");
        }
    
        @PreDestroy
        public void close() throws Exception {
            System.out.println("NetworkClient.close");
            disconnect();
        }
    }

    어노테이션을 이용하면 빈의 생성, 소멸 시점에 해당 메서드를 실행시켜준다.

     

     

    public class BeanLifeCycleTest {
    
        @Test
        public void lifeCycleTest() {
            ConfigurableApplicationContext ac = new AnnotationConfigApplicationContext(LifeCycleConfig.class);
            NetworkClient client = ac.getBean(NetworkClient.class);
            ac.close();
        }
    
        @Configuration
        static class LifeCycleConfig {
    
            @Bean
            public NetworkClient networkClient() {
                NetworkClient networkClient = new NetworkClient();
                networkClient.setUrl("http://hello-spring.dev");
                return networkClient;
            }
        }
    }

    NetworkClient를 빈으로 등록하고 실행시킨 결과, 생성 시점에 @PostConstruct가, 소멸 시점에 @PreDestory가 실행된다는 것을 확인했다.

    '스프링 > 스프링 기본이론' 카테고리의 다른 글

    프로토타입 스코프  (0) 2023.02.01
    어노테이션을 직접 만들기  (0) 2023.02.01
    빈이 2개 이상일 경우에 의존관계 주입  (0) 2023.02.01
    의존관계 자동 주입  (0) 2023.01.31
    컴포넌트 스캔  (0) 2023.01.30
Designed by Tistory.