[기본기] 8-2. 빈 생명주기 콜백 2탄

khyojun·2022년 10월 9일
0
post-thumbnail

본 게시글은 김영한님의 스프링 핵심 원리 기본편을 정리한 글입니다.


이전 글에 이어서 빈 생명주기를 콜백하는 방법 2가지를 더 알아보자.

📌 설정 정보에 초기화, 종료 메서드 지정

설정 정보에 위 부제처럼 초기화, 종료 메서드를 지정할 수 있다고 하는데 한 번 코드를 보자.

public class NetworkClient{


    private String url;


    public NetworkClient() {
        System.out.println("생성자 호출, url  = " + url);
    }

    public void setUrl(String url) {
        this.url = url;
    }


    // 서비스 시작시 호출
    public void connect(){
        System.out.println("connect : " + url);
    }


    public void call(String message){
        System.out.println("call : " + url + " message " + message);
    }

    //서비스 종료시 호출
    public void disconnect(){
        System.out.println("close : " + url);
    }


 	public void init(){
        System.out.println("NetworkClient : init");
        connect();
        call("초기화 연결 메시지");
    }

    
    public void close(){
        System.out.println("NetworkClient.close");
        disconnect();
    }
   
static class LifeCycleConfig{
        @Bean(initMethod = "init", destroyMethod = "close")
        public NetworkClient networkClient(){
            NetworkClient networkClient = new NetworkClient();
            networkClient.setUrl("http://hello-spring.dev");
            return networkClient;
        }
    }

위 2가지 코드를 보면 이제 이전에는 InitializingBean과 DisposableBean을 통하여서 메서드를 끌고와서 진행을 하였지만 이번에는 그런 것 없이도 메서드 만으로 진행을 하였다. 이로 인하여 볼 수 있는 장점들은 다음과 같았다.

  1. 메서드 이름을 자유롭게 지정
  2. 스프링 빈이 스프링 코드에 의존하지 않음
  3. 외부 라이브러리에도 초기화, 종료 메서드를 적용

그리고 또 여기서 신기한 점이 한 가지가 잇는데 @Bean(initMethod = "init", destroyMethod = "close") 이 부분을 보는데 destroyMethod를 부분을 보게 되면 처음 아무것도 작성하지 않을 경우 destroyMethod = (inferred) 라는 알림이 뜬다. inferred? 해석하면 추론한다는 것인데 되게 신기한 기능이다.

라이브러리들의 대부분은 close, shutdown이라는 이름의 종료 메서드를 사용하게 된다.

inferred를 통하여서 close, shutdown라는 이름의 메서드를 자동으로 호출하게 된다.

그래서 종료 메서드는 따로 적어주지 않아도 다음과 같은 이름을 알아서 찾아서 동작을 하게 된다.(되게 신기한 기능...!)
이 기능은 그래서 destroyMethod=""처럼 진짜로 지정하지 않는 경우만 아니면 작동을 한다고 한다.

📌 @PostConstruct, @PreDestroy

이번에는 애노테이션을 활용한 방법을 한 번 보자.

   @PostConstruct
    public void init(){
        System.out.println("NetworkClient : init");
        connect();
        call("초기화 연결 메시지");
    }

    @PreDestroy
    public void close(){
        System.out.println("NetworkClient.close");
        disconnect();
    }
static class LifeCycleConfig{
        @Bean
        public NetworkClient networkClient(){
            NetworkClient networkClient = new NetworkClient();
            networkClient.setUrl("http://hello-spring.dev");
            return networkClient;
        }
    }

이전 코드와 달리 더 간단해졌다. 그래서 강의에서도 언급을 하시지만 대부분 이 방법을 많이 사용을 하신다고 한다. 가장 큰 장점으로 너~~~무 편하다. 위 어노테이션에 대한 특징은 다음과 같다.

  • 최신 스프링에서 가장 권장하는 방법.
  • 애노테이션 하나만 붙이면 되서 되게 편하다.
  • 컴포넌트 스캔이랑 잘 어울린다.
  • 유일한 단점으로는 외부 라이브러리에 적용하지 못한다. -> 적용을 하고 싶으면 @Bean의 기능을 활용한다.
  • 위 애노테이션을 사용하는 패키지를 보면 javax.~~ 이기에 자바의 표준을 사용하는 방법이기에 스프링이 아닌 다른 컨테이너에서도 동작을 하게 된다.

오늘의 결론

애노테이션을 활용하는 방법을 활용하자.(@PostConstruct, @PreDestroy) 그리고 외부 라이브러리를 사용하고 싶다면 @Bean initMethod, destroyMethod를 활용하자.

출처

  1. 김영한님의 스프링 핵심 원리 기본편(https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8)
profile
코드를 씹고 뜯고 맛보고 즐기는 것을 지향하는 개발자가 되고 싶습니다

0개의 댓글