해결된 질문
작성
·
707
·
수정됨
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 의 의미는 무엇일까요?
답변 1
2
자바 서버 애플리케이션 서버, 서블릿 컨테이너 등의 구현에 따라 여러 개의 클래스 로더가 사용되기도 합니다. 그건 전적으로 서버의 설계에 달린 것입니다. 이렇게 여러개의 클래스 로더가 동작하는 환경에서 스프링 컨테이너가 빈 오브젝트를 생성할 때 사용했던 클래스로더를 이용해서 애플리케이션 오브젝트를 찾아야 하는, 어떤 프레임워크를 만든다면 이 BeanClassLoaderAwarey를 이용해서 빈을 생성하는데 사용된 클래스로더를 이용해서 오브젝트를 찾도록 하기 위해서 이런 라이프사이클 메소드를 제공합니다.
요즘처럼 서버를 마이크로서비스 아키텍처에 적합하게 아주 가볍게 만드는 경우라면 클래스로더를 매우 심플하게 구성하고 사용하는 것이 일반적일 것입니다. 스프링이 거쳐온 20여년의 역사를 돌아보면 매우 무겁고, 한번 배포한 뒤에 웹 애플리케이션이 여러 개가, 여러 번 반복해서 로딩되기도 하는 그런 복잡한 WAS 환경이 있었고, 그런데서 클래스로더를 바르게 선택하지 않으면 원하는 기능을 만들기 어려운 상황이 있었을 것입니다. 그런 시절의 요구를 반영할 수 있도록 준비해둔 것이 이 인터페이스입니다.
요즘 부트 개발환경 같으면 별로 중요해보이지 않을 수도 있겠죠. 그래도 가장 안전한 방식으로 로우 레벨에서 빈 오브젝트를 찾거나 클래스패스 리소스 등에 접근한다면 빈 클래스로더를 가져와 사용하는게 확실한 방법입니다. 문서에 나오듯이 이는 프레임워크 수준의 개발을 할 경우에 필요한 것이고, 일반적인 애플리케이션 개발에는 거의 사용할 일은 없습니다.
궁금하시면 이 인터페이스를 사용하는 클래스들이 어떤게 있는지 찾아보세요.
답변 감사드립니다
사용하는 클래스들도 더 공부해보도록 할게요!