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

YH님의 프로필 이미지
YH

작성한 질문수

스프링 핵심 원리 - 기본편

인터페이스 InitializingBean, DisposableBean

외부 라이브러리에 적용 관련 질문

작성

·

552

1

안녕하세요!!! 생명주기 관련해서 질문드립니다.

강의에서 인터페이스를 활용한 생명주기 콜백은 외부 라이브러리에 적용할 수 없다고 말씀하신 부분에 대해서,

'외부 라이브러리에 정의된 클래스를 스프링 빈으로 등록하려고 할 경우 초기화,소멸전 콜백을 적용할 수 없다' 로 이해해도 괜찮을까요??

답변 1

0

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

안녕하세요. 이윤환님

@Bean을 통해 직접 등록할 때는 외부 라이브러리여도 어떤 메서드를 초기화로 사용할 지 지정할 수 있습니다.

그런데 @PostConstruct는 소스코드를 직접 수정해야 하는데, 외부 라이브러리의 코드를 수정할 수 없으니, 이 방법으로는 초기화 콜백을 적용할 수 없다는 뜻입니다.

감사합니다.

안녕하세요. 영한님                                          동일한 궁금증이 있어서 질문을 뒤지다가 해당 글과 답변을 찾았는데 설명해주신 내용이 잘 이해가 안가네요.

@Bean을 통해 직접 등록할 때는 외부 라이브러리여도 어떤 메서드를 초기화로 사용할 지 지정할 수 있습니다. 

이게 무슨 말일까요? @Bean을 통해 직접 등록할 경우에, 강의에서 나오듯 인터페이스를 구현해 사용하면 afterPropertiesSet, destroy가 각각 메소드가 의존관계 주입이 끝난후, 스프링 컨테이너가 종료되기 전 두 가지 경우에 호출되는 것으로 정해져 있는 것 아닌가요?

'어떤 메서드를 초기화로 사용할지 지정한다'라는 말이 무슨 뜻이죠? 이어서 그 아래 내용도 잘 이해가 안가는데, 설명 부탁드려도 될까요?

그냥 @Bean을 통해 스프링 빈을 등록할 경우에는 외부라이브러리를 써도 해당 인터페이스를 구현한 메서드로 처리가 가능하고, @PostContruct가 붙은? 혹은 @PostConstruct를 붙인 메소드를 이용하면 외부 라이브러리를 쓸 때, 해당 인터페이스를 구현한 메소드로는 처리가 불가능 하다는 말로 이해하면 될까요?

감사합니다.

아.. 다음 강의 보니 내용이 이해가 가네요.. @PostConstruct는 그 다음 강의에 나오니 기다려 봐야겠네요.. 

이런 말이였군요. 외부라이브러리 사용 시 시작과 종료 메서드를 사용해야할 경우가 있습니다. 예를 들어, 사용하는 외부라이브러리에서 시작 메서드 = gogo, 종료 메서드 = byebye라는 명칭으로 꼭 호출해줘야 할 경우, 해당 강의의 인터페이스를 구현하면 의존관계 주입 후와 스프링 컨테이너 종료 전 각각 정해진 메소드명을 호출하기 때문에 gogo, byebye를 호출해줄 수 있는 방법이 없고, 이게 한계이자 단점이 되는거군요. 다음 강의에서 이를 해결할 수 있는 방법이 있구요.

다시 돌아왔습니다. @PostConstruct 강의 보고 이해안되서, 질문글 다 읽어보고 또 이해 안되서 혼자 곰곰히 생각해보니 이해가 되더군요.

지금은 우리가 짜놓은 메서드 안에 init, close가 존재하지만, 외부라이브러리를 사용하게 되면 외부 라이브러리에서 init, close에 해당하는 메소드가 이미 작성되어 있고, 그것은 이미 컴파일되서 고칠 수 없습니다. 

따라서 우리가 직접 작성하는 코드에서 외부라이브러리의 init, close에 해당하는 메소드를 호출하는 방법은 @Bean의 initMethod, destroyMethod에 해당 외부라이브러리의 init, close에 해당하는 메소드 명을 기재해주는 방법 밖에 없습니다. 왜냐하면 PostConstructor를 쓰기 위해서는 직접 해당 외부 라이브러리의 init, close 메서드에 해당하는 메서드 위에 어노테이션을 붙여야 하는데, 이미 컴파일된 코드는 수정이 불가능하다. 이 내용 맞나요?

근데 위 내용이 맞다고 치고, 해결되지 않는 한가지 궁금한 점이 있습니다.  @Bean을 통해 스프링 빈으로 등록하면 하나의 빈을 등록하는 것이 아니기 때문에, 등록되는 빈이 여러개일텐데 어떤 @Bean 옆에 initMethod, destroyMethod를 기재해줘야 하나요?  외부라이브러리를 호출해서 사용하는 빈에 @Bean에 기재해주는 걸까요?

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

안녕하세요. 유진이님

생각하신 내용이 맞습니다. 그리고 @Bean을 통해 스프링 빈으로 등록하면 하나의 빈만 등록됩니다.

감사합니다.

YH님의 프로필 이미지
YH

작성한 질문수

질문하기