inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

토비의 스프링 부트 - 이해와 원리

자동 구성 정보 파일 분리

BeanClassLoaderAware 인터페이스가 궁금하여 질문드립니다.

해결된 질문

802

이석준

작성한 질문수 8

0

BeanClassLoaderAware 를 통해 ClassLoader 를 주입을 받는다고 가정할 때

public class MyAutoConfigImportSelector implements DeferredImportSelector, BeanClassLoaderAware {

  private ClassLoader classLoader;

  @Override
  public String[] selectImports(AnnotationMetadata importingClassMetadata) {
    List<String> autoConfigs = new ArrayList<>();

    ImportCandidates.load(MyAutoConfiguration.class, classLoader)
        .forEach(autoConfigs::add);

    return autoConfigs.toArray(new String[0]);
  }

  @Override
  public void setBeanClassLoader(ClassLoader classLoader) {
    this.classLoader = classLoader;
  }
}

MyAutoConfigImportSelector 는 스프링에서 사용하는 공유되는 클래스로더에 의해서 로딩되는 것으로 확인하였습니다. (this.getClass().getClassLoader() 로 해도 같은동작)

그렇다면 BeanClassLoaderAware 인터페이스를 스프링에서 제공하는 이유는 무엇일까 궁금하여 질문드립니다.

또한 BeanClassLoaderAware javadoc 에서 framework classes 가 구현하도록 의도되었다고하는데 framework classes 의 의미는 무엇일까요?

spring spring-boot spring-jdbc

답변 1

2

토비

자바 서버 애플리케이션 서버, 서블릿 컨테이너 등의 구현에 따라 여러 개의 클래스 로더가 사용되기도 합니다. 그건 전적으로 서버의 설계에 달린 것입니다. 이렇게 여러개의 클래스 로더가 동작하는 환경에서 스프링 컨테이너가 빈 오브젝트를 생성할 때 사용했던 클래스로더를 이용해서 애플리케이션 오브젝트를 찾아야 하는, 어떤 프레임워크를 만든다면 이 BeanClassLoaderAwarey를 이용해서 빈을 생성하는데 사용된 클래스로더를 이용해서 오브젝트를 찾도록 하기 위해서 이런 라이프사이클 메소드를 제공합니다.

요즘처럼 서버를 마이크로서비스 아키텍처에 적합하게 아주 가볍게 만드는 경우라면 클래스로더를 매우 심플하게 구성하고 사용하는 것이 일반적일 것입니다. 스프링이 거쳐온 20여년의 역사를 돌아보면 매우 무겁고, 한번 배포한 뒤에 웹 애플리케이션이 여러 개가, 여러 번 반복해서 로딩되기도 하는 그런 복잡한 WAS 환경이 있었고, 그런데서 클래스로더를 바르게 선택하지 않으면 원하는 기능을 만들기 어려운 상황이 있었을 것입니다. 그런 시절의 요구를 반영할 수 있도록 준비해둔 것이 이 인터페이스입니다.

요즘 부트 개발환경 같으면 별로 중요해보이지 않을 수도 있겠죠. 그래도 가장 안전한 방식으로 로우 레벨에서 빈 오브젝트를 찾거나 클래스패스 리소스 등에 접근한다면 빈 클래스로더를 가져와 사용하는게 확실한 방법입니다. 문서에 나오듯이 이는 프레임워크 수준의 개발을 할 경우에 필요한 것이고, 일반적인 애플리케이션 개발에는 거의 사용할 일은 없습니다.

궁금하시면 이 인터페이스를 사용하는 클래스들이 어떤게 있는지 찾아보세요.

0

이석준

답변 감사드립니다

사용하는 클래스들도 더 공부해보도록 할게요!

11강에서 cmd에서 spring shell에 $ init 하면 Fail 메세지

0

75

2

TestRestTemplate 을 통해 테스트 실행시 웹 요청 정보가 콘솔에 표시되지 않습니다.

0

85

1

섹션7. 자동구성 정보파일분리 강의 질문(@MyAutoConfiguration 붙힌 이유)

0

201

2

WebApplicationContext를 DispatcherServlet에 this로 넘기는 것

0

279

2

인프라 빈 구성 정보의 분리에서 EnableMyAutoConfiguration 질문드립니다.

0

210

2

질문드립니다.

0

232

2

spring boot 3.3.7로 학습중입니다.

0

369

2

Serverproperties 객체 생성 후 @Impor 어노테이션 사용 이유 용도

0

162

2

spring start io 에서 이제더이상 2.x버전은 지원하지 않는 것 같습니다.

1

296

2

Springboot 3.2 이상에서 파라미터 추론관련

0

913

4

binding error

0

220

3

Arrays.copyOf 메서드의 타입 세이프

1

155

2

MyOnClassCondition에 있는 matches method의 Invoke 횟수

1

233

3

인용구의 출처가 궁금합니다.

0

259

1

프로퍼티 빈의 후처리기 도입 AnnotationUtils의 사용

0

236

2

SimpleCacheConfiguration과 빈 등록

0

168

2

MyAutoConfigImportSelector 에서 생성자로 ClassLoader를 주입받을 수 있는 점

0

244

1

IntelliJ project jenerator spring initailizr

0

150

1

강의 자료 레퍼지토리에 업로드

0

216

1

강의자료

0

388

1

Hikari 라이브러리가 없으면 오류가 나는거 아닌가요

0

314

2

Tomcat 포트 프로퍼티 미설정시 랜덤 포트 설정 문의

0

476

5

@Import 로 Bean을 등록해야하는 기준이 뭔지 궁금합니다.

0

340

2

application.properties파일내 프로퍼티 이름

0

210

1