inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 핵심 원리 - 기본편

인터페이스 InitializingBean, DisposableBean

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

607

YH

작성한 질문수 6

1

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

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

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

spring oop

답변 1

0

김영한

안녕하세요. 이윤환님

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

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

감사합니다.

0

유진이

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

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

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

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

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

감사합니다.

0

유진이

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

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

0

유진이

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

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

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

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

0

김영한

안녕하세요. 유진이님

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

감사합니다.

SingletonService가 JVM이 뜰 때 생성되는게 맞나요?

0

29

1

섹션3. 11 회원객체 다이어그램

0

36

1

OCP, DIP과 @Qualifier 어노테이션에 대해서 질문합니다.

0

35

1

코드 자료

0

80

2

구현체가 동적으로 정해질 때, 팩토리 기법을 사용하나요?

0

82

2

MemberService의 인터페이스를 왜 사용하는지 궁금합니다.

0

98

1

롬복 @Setter를 써야 하는 상황이 있는건가요?

0

104

1

빈 등록 메서드의 파라미터가 빈이 아니어도 되나요?

0

88

1

테스트 속도가 나중에 영향이 있을까요?

0

90

1

gradle 설정 안떠서 질문 남깁니다!

0

140

2

build.gradle로 프로젝트를 여는 이유

0

100

1

provider 사용하는 이유

0

97

1

다음 강의 뭘 들어야 할까요

0

139

2

프로토타입 빈, 직접 destroy 호출 안 할 경우

0

69

1

beanB

0

91

2

퀴즈다시풀기

0

75

1

Gradle로 바꿔도 오류가 똑같이 발생하네요 ㅠㅠ

0

102

2

"중복 등록과 충돌" 강의에서 강사님과 다른 에러가 발생합니다.

0

71

3

run 실행했는데 결과창이 이렇게 뜨네요 왜 그런건가요>

0

112

2

도메인의 정의?

0

63

1

ApplicationContext 질문입니다.

0

68

1

@Scope의 proxyMode를 사용할때 단위 테스트 방법

0

98

2

ai api 선정하기 관련 질문

0

134

2

생성자 자동주입 관련해서

0

69

1