인프런 커뮤니티 질문&답변

강호찬님의 프로필 이미지
강호찬

작성한 질문수

스프링 핵심 원리 - 기본편

@Bean 설정 정보를 통한 빈 생명주기 콜백 등록 질문드립니다

해결된 질문

작성

·

286

1

@Configuration
public class LifeCycleConfig {

    @Bean(initMethod = "init", destroyMethod = "close")
    public NetworkClient networkClient() {
        NetworkClient networkClient = new NetworkClient();
        ...
    }
}

위와 같이 @Bean에 initMethod와 destroyMethod를 명시하여 빈 생명주기 콜백을 등록하는 방식에서, 중요한 장점으로 코드를 고칠 수 없는 외부 라이브러리에도 초기화, 종료 메서드를 적용할 수 있다는 점을 꼽아주셨습니다.

 

그런데 혹시 그게 어떻게 가능한가요?

명시한 initMethod와 destroyMethod를 반환되는 빈 객체 내부 메소드에서 찾는 것 같은데, 그러면 그 외부 라이브러리 클래스 내부에 메서드를 작성해서 해당 메서드 명을 명시해주어야 할 필요가 있지 않은가요?

아니면 혹시 해당 외부 라이브러리 클래스를 상속 받는 별도의 클래스를 작성한 뒤, 해당 클래스에 init, close 메소드를 구현한 뒤, 그 클래스를 빈으로 등록하는 방식일까요? 아니라면 어떤 식으로 등록할 수 있나요?

 

만약 상속해서 구현하는 방식이라면, InitializingBean, DisposableBean 인터페이스를 구현하는 방식도, 외부 라이브러리 클래스를 상속 받는 클래스를 작성한 뒤, 해당 클래스가 InitializingBean, DisposableBean을 구현하게끔 하고 그 클래스를 빈으로 등록하면 안되나요? (@PostConstruct와 @PreDestory로 등록하는 방식도 마찬가지로 외부 라이브러리 클래스를 상속 받은 뒤 구현할 수 없는 건가요?) 이러한 경우 어떠한 문제가 발생하나요?

 

직접 코드를 수정할 수 없는 외부 라이브러리에 빈 생명주기 콜백을 등록할 수 있는지 여부로 장단점이 나뉘었는데, 상속해서 등록하는 방식이라면 모두 다 가능하지 않은가 싶어서 질문 드리게 되었습니다. 잘못 이해한 부분이 있다면 알려주시면 감사드리겠습니다.

 

관련 강의

  • '섹션 8. 빈 생명주기 콜백' - 빈 등록 초기화, 소멸 메서드

답변 1

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 강호찬님

여기서 예시는 상속도 하지 못하는 상황을 떠올려보시면 됩니다. 상속을 하게 되면 코드를 직접 수정할 수 있으니 수 많은 대안이 있겠지요?

예를 들어서 외부 라이브러리를 사용하는데, 상속을 하지 못하게 막혀있습니다. (물론 상속을 할 수 있는 상황도 사용할 수 있습니다) 외부 라이브러리의 클래스가 초기화와 종료 메서드의 기능을 모두 제공하는 상태이고, 이것을 애플리케이션 시작 단계에서 초기화를 호출하고, 종료 단계에서 종료 메서드를 꼭 호출해주어야 하는 상황일 수 있습니다.

이럴 때 사용하면 됩니다.

감사합니다.

강호찬님의 프로필 이미지
강호찬
질문자

안녕하세요 김영한 선생님.

말씀하신대로 외부 라이브러리 클래스가 초기화와 종료 메서드의 기능을 이미 제공하는 상태인 경우, @Bean에 이를 등록하기만 하면 되니 왜 장점인지 이해가 갑니다.

감사합니다.

강호찬님의 프로필 이미지
강호찬

작성한 질문수

질문하기