[스프링부트] 5. 컴포넌트 스캔

백하림's avatar
Mar 13, 2025
[스프링부트] 5. 컴포넌트 스캔
 

ex04 안에 있는 모든 클래스 스캔

package ex04; import java.io.File; import java.net.URL; import java.util.HashSet; import java.util.Set; public class App { public static void main(String[] args) { // 1. @Component가 붙으면 new해서 컬렉션에 담기 Set<Object> instances = new HashSet(); ClassLoader classLoader = ClassLoader.getSystemClassLoader(); URL packageUrl = classLoader.getResource("ex04"); File packageDir = new File(packageUrl.getFile()); for (File file : packageDir.listFiles()) { if (file.getName().endsWith(".class")) { String className = "ex04." + file.getName().replace(".class", ""); System.out.println(className); } } } }
notion image

ex04 안에 있는 클래스 중 @Component가 붙은 클래스만 출력

package ex04; import java.io.File; import java.net.URL; import java.util.HashSet; import java.util.Set; public class App { public static void main(String[] args) { // 1. @Component가 붙으면 new해서 컬렉션에 담기 Set<Object> instances = new HashSet(); ClassLoader classLoader = ClassLoader.getSystemClassLoader(); URL packageUrl = classLoader.getResource("ex04"); File packageDir = new File(packageUrl.getFile()); for (File file : packageDir.listFiles()) { if (file.getName().endsWith(".class")) { String className = "ex04." + file.getName().replace(".class", ""); //System.out.println(className); try { Class cls = Class.forName(className); if (cls.isAnnotationPresent(Component.class)) { Object instance = cls.getDeclaredConstructor().newInstance(); instances.add(instance); } } catch (Exception e) { throw new RuntimeException(e); } } } // for 종료 for (Object instance : instances) { System.out.println(instance.getClass().getName()); } } }
notion image

📌 코드 설명

1️⃣ 패키지에서 .class 파일 탐색

ClassLoader classLoader = ClassLoader.getSystemClassLoader(); URL packageUrl = classLoader.getResource("ex04"); File packageDir = new File(packageUrl.getFile()
💡
  • ex04 패키지의 위치를 찾아 해당 디렉토리를 File 객체로 변환
for (File file : packageDir.listFiles()) { if (file.getName().endsWith(".class")) { String className = "ex04." + file.getName().replace(".class", ""); System.out.println(className); } }
💡
  • .class 확장자가 붙은 파일을 찾아 클래스 이름을 문자열로 변환

2️⃣ @Component가 있는 클래스만 인스턴스화

Class cls = Class.forName(className); if (cls.isAnnotationPresent(Component.class)) { Object instance = cls.getDeclaredConstructor().newInstance(); instances.add(instance);
💡
  • Class.forName()을 사용하여 문자열을 실제 클래스 객체로 변환
  • cls.isAnnotationPresent(Component.class)으로 @Component가 붙은 클래스만 필터링
  • cls.getDeclaredConstructor().newInstance()를 통해 인스턴스를 생성하고 Set<Object>에 저장

3️⃣ 결과 출력

for (Object instance : instances) { System.out.println(instance.getClass().getName()); }
💡
  • @Component가 붙은 클래스의 인스턴스 목록을 출력

📌 정리

기능
설명
패키지 내 .class 파일 찾기
ClassLoaderFile을 이용해 특정 패키지에서 .class 파일 목록을 가져옴
리플렉션으로 클래스 로딩
Class.forName(className)을 사용하여 문자열을 실제 클래스 객체로 변환
@Component 확인
cls.isAnnotationPresent(Component.class)으로 @Component 애너테이션이 있는지 검사
객체 생성 및 저장
cls.getDeclaredConstructor().newInstance()를 이용해 인스턴스를 생성하고 Set<Object>에 저장
결과 출력
Set<Object>에 저장된 인스턴스의 클래스명을 출력
 
Share article

harimmon