• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

섹션6. 자동 구성 정보 파일 분리 강의에서 질문 있습니다

24.04.20 00:01 작성 24.04.20 00:08 수정 조회수 107

0

MyAutoConfigImportSelector를 ImportSelector 인터페이스를 구현하시는 강의를 보았습니다.

 

한가지 궁금한게 직접 스프링 부트 실행시 MyAutoConfigImportSelector가 생성되는 것을 디버깅을 통해 확인을 해보았는데, ConfigurationClassParser 클래스의 processImports 메서드라는 곳에서 일시적으로 ImportSelect 구현 클래스(MyAutoConfigImportSelector)를 인스턴스화 하는 코드를 확인하였고,

그 이후, ImportSelect 구현 클래스인 MyAutoConfigImportSelector의 selectImports 메서드를 호출하는 것을 확인하였습니다. (ConfigurationClassParser 566 ~ 582 라인)

 

그렇다면, MyAutoConfigImportSelector의 생성자에서 classLoader를 의존성 주입 받는 것이 아니라 일시적으로 MyAutoConfigImportSelector를 인스턴스화하여 classLoader를 생성자에서 초기화하고, 그 이후에 selectImports를 호출하는걸로 봐도 될까요?

라이브러리 코드를 좀더 깊게 살펴보니, 생성자에서 Environment, ResourceLoader, BeanFactory, ClassLoader 총 4가지 클래스에 대해서만 객체를 설정해주는 것을 확인할 수 있었습니다.

 

처음엔 classLoader를 스프링 빈 컨테이너가 알아서 의존성 주입으로 classLoader를 주입하는줄 알았는데, 생각을 해보니 의존성 주입은 스프링 빈 컨테이너가 스캔 대상인 빈들 내부에서만 의존성 주입을 하는 것으로 알고 있는데, MyAutoConfigImportSelector 같은 경우는 ApplicationContext 클래스에서 확인해보아도 빈으로 생성되지 않고 있습니다.

답변 2

·

답변을 작성해보세요.

0

어려운 걸 분석해보고 계시네요.

ImportSelector는 스프링에서도 독특하게 사용되는 오브젝트가 구현하는 인터페이스로 보입니다. 다른 @Configuration 클래스를 생성해내는 작업을 담당하고 있으니 꽤나 독특한 위치에 있죠. 어쨌든 @Import에 의해서 등록이 되고 이 오브젝트를 생성하는 건 스프링이니 필요한 클래스로더 등을 주입해주는 것도 스프링입니다. 이걸 일반 빈으로 등록할 필요는 굳이 없어보이네요.

isLoaded()님의 프로필

isLoaded()

질문자

2024.04.22

감사합니다.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.04.20

안녕하세요, 인프런 AI 인턴입니다.

chunseunghun님께서 질문하신 내용에 대해서는, MyAutoConfigImportSelector가 인스턴스화되는 과정과 selectImports 메소드 호출에 관한 내용, 그리고 BeanClassLoaderAware 인터페이스와 관련된 클래스 로더의 주입과정에 대해 관심을 가지신 것으로 보입니다. 이와 관련하여 “BeanClassLoaderAware 인터페이스가 궁금하여 질문드립니다.“라는 제목의 질문이 이전에 있었고, 해당 내용이 chunseunghun님의 질문에 부분적으로 답변을 제공할 수 있을 것 같습니다.

관련 질문 링크:

이 질문에서는 BeanClassLoaderAware를 통해 ClassLoader를 주입받는 과정이 설명되어 있습니다. 특히, 스프링 프레임워크에서 BeanClassLoaderAware 인터페이스를 사용하는 목적과, BeanClassLoaderAware가 제공하는 setBeanClassLoader(ClassLoader classLoader) 메소드를 통해 클래스 로더를 설정하는 방법에 대해 다루고 있습니다.

MyAutoConfigImportSelector와 같은 ImportSelector 구현체는 스프링의 조건부 로직 처리와 관련하여 구성 클래스를 동적으로 선택하는 역할을 합니다. ImportSelector 인터페이스를 구현한 클래스는 스프링 컨테이너에 의해 직접적으로 빈으로 관리되지 않지만, 그 과정에서 필요한 ClassLoader 등을 일시적으로 받아서 사용할 수 있습니다. 이것이 BeanClassLoaderAware와 같은 Aware 인터페이스의 용도 중 하나입니다.

현재 설명드린 정보가 chunseunghun님의 궁금증을 해소하는데 도움이 되길 바랍니다. 추가적인 질문이나 궁금한 점이 있으시다면, 언제든지 질문해 주세요.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.