스프링/MVC

[MVC 기초] 빈 라이프 사이클 이용해서 의존관계 (기본 @PostConstruct, @PreDestroy + 수정 불가한 외부 라이브러리의 빈 생성, 파괴시에 동작시키는 방법)

nomoreFt 2022. 3. 30. 22:58
  • 특정 빈을 Spring에 등록하고, 그 빈의 의존관계가 주입된 후(완전히 생성된 후) 무언가 작업을 하고,

    삭제 전에 어떤 작업을 하고 싶을 때가 있다. 기본적으로 @PostConstruct, @PreDestroy 사용을 하면 된다.
  • 그러나 외부 라이브러리를 사용할 때도 있는데, 이럴 때는 내부 코드를 수정할 수 없으므로
    수동으로 @Bean 등록시에 특정 메서드의 이름을 생성후, 소멸전 메서드로 등록을 해줘야 한다.

스프링 빈의 라이프 사이클

기본적인 @PostConstruct, @PreDestroy의 동작 시점은 아래와 같다.

스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> @PostConstruct -> 사용로직 -> @PreDestroy -> 스프링 종료

// 기본 어노테이션 사용법


    @PostConstruct
    public void init() throws Exception {
        //의존 관계 주입이 끝나면 호출
        System.out.println("NetworkClient.afterPropertiesSet");
        connect();
        call("초기화 연결 메세지");
    }

    @PreDestroy
    public void close() throws Exception {
        System.out.println("NetworkClient.destroy");
        disconnect();
    }

특정 라이브러리에서 생명주기에 맞춰 사용법(@Bean(initMethod = "init",destroyMethod = "beforeDestroy"))

  • 보통 외부 라이브러리를 사용하면, @PostConstruct, PreDestroy 시점에 호출해줘야 할 경우가 생긴다.
  • 그럴 때 외부 라이브러리를 @Configuration 파일의 @Bean으로 등록하면서, 특정 메서드를 호출해달라고 이름으로 설정해줄 수 있다.

사용법

@Configuration
    static class LifeCycleConfig {
       ************************************************************
        @Bean(initMethod = "init",destroyMethod = "beforeDestroy")
        ************************************************************
        public NetworkClient networkClient() {
            NetworkClient networkClient = new NetworkClient();
            networkClient.setUrl("http://hello-spring.dev");
            return networkClient;
        }
    }
  • 외부 라이브러리의 사용법에 맞춰 메서드명만 맞춰주면 된다.

💥 Bean의 destroyMethod는 추론이라는 기능이 내장되어 있는데, close,shutdown 이름의 메서드를 자동으로 추적하여 종료 직전에 호출해준다.
설정하지 않아도 작동된다고 놀라지 말자!