특정 패키지의 모든 클래스에 대한 메타데이터 읽어들이기

2014년 02월 09일 by 다루이.

    특정 패키지의 모든 클래스에 대한 메타데이터 읽어들이기 목차

스프링 프레임 워크에서는 편리하게도 특정 패키지나 클래스, 또는 패턴을 지정하면 해당하는 클래스에 대해서 빈으로 등록해주는 편리한 기능을 가지고 있습니다. 저는 이게 단순히 리플렉션에 의한것이라고 추측했는데 그게 아니더라구요.

일단 소스를 한번 보면 대략 이렇습니다.

 

만약에 이런 패키지가 존재한다고 가정하면은

 

 

 

다음과 같이 지정하면 위의 클래스에 대한 메타정보를 다 읽어들이게 할 수 있다는거지요.

com/test/mpapp/*.class

 

역시 스프링에서는 이렇게 읽어들이는것을 리플렉션으로 하지는 않습니다. asm이라는 라이브러리에 포함된 기능을 이용한다고 하네요.

구체적으로 확인하면 다음과 같습니다.

  

  PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
  Resource[] rs = resolver.getResources("com/test/mpapp/*.class");
  
  for(Resource r: rs){
   MetadataReader mr = new SimpleMetadataReaderFactory().getMetadataReader(r);
   
   System.out.println(mr.getClassMetadata().getClassName());
   
   
  } 

 

1. PathMatchingResourcePatternResolver 

 패턴으로 표현되는 범위로부터 해당하는 클래스들의 리소스 정보를 읽어들입니다.

 

2. SimpleMetadataReaderFactory

 

이게 끝이네요..

 

그리고 결과를 보면 다음과 같습니다.

 

 

참고로 이렇게 리소스로 읽어 들이는것과 리플렉스기능을 이용해서 읽어들이는 가장 큰 차이점은 메모리사용상의 차이라고 합니다. 리플렉스로 클래스에 대한 정보를 읽어들이면 해당 클래스 전체를 메모리에 올려야 하고 리소스를 먼저 읽어들여서 메타정보를 확인하는 방법은 일일이 메모리로 클래스를 넣지 않아도 되니까 뭐 속도면이나 자원사용면이나 유리한것같네요.

 

클래스의 리소스객체로부터 메타정보를 읽어들입니다. (메타정보라 함은 한마디로 부가정보입니다. 사진을 찍으면 날짜나 위치정보같은게 부가적으로 붙는것처럼)