[Spring] ResourcePatternResolver 인터페이스

2022. 10. 3. 14:43JAVA/Spring

1. ResourcePatternResolver 인터페이스는 무엇인가?

  • ResourcePatternResolver 인터페이스는 ResourceLoader 인터페이스를 상속받은 확장판 인터페이스입니다.
  • ResourcePatternResolver 인터페이스의 getResources 메서드는 매개변수로 문자열 타입의 위치 패턴(locationPattern)을 입력받아 해당 패턴에 만족하는 자원들을 가져오는 기능입니다.
  • ApplicationContext 인터페이스는 ResourcePatternResolver 인터페이스를 상속받기 때문에 getResources 메서드를 호출하여 여러 자원들을 가져올 수 있습니다.

 

ResourcePatternResolver 인터페이스 정의

public interface ResourcePatternResolver extends ResourceLoader {

    String CLASSPATH_ALL_URL_PREFIX = "classpath*:";

    Resource[] getResources(String locationPattern) throws IOException;
}
  • String CLASSPATH_ALL_URL_PREFIX = "classpath*:" : 클래스패스로부터 매칭되는 모든 자원들을 대상으로 하기 위해서 정의한 접두어입니다.
    • 예를 들어 "classpath*:/config/beans.xml" 위치 패턴같은 경우에 자리 표시자(placeholder)가 없는 특정 파일의 경로가 됩니다.
    • 클래스 패스 경로안에 있는 JAR 파일이나 다른 디렉토리 파일같은 경우에는 다수의 파일들을 포함시킬 수 있습니다. 이때 "classpath*:/config/*.xml"와 같이 위치 패턴을 설정할 수 있습니다.

 

PathMatchingResourcePatternResolver 클래스

  • ResourcePatternResolver 인터페이스의 구현체
  • ApplicationContext 인터페이스 외부에서 사용할 수 있는 독립 실행 구현체
  • Resource[] 빈 속성들을 채우기 위해 ResourceArrayPropertyEditor에서도 사용됨
  • 특정 자원의 위치 경로에서 한개 이상의 자원들을 가져올 수 있음
    • 자원의 위치 경로는 특정 한개의 파일을 가리킬 수 있고 접두어인 "classpath*:"만 포함하거나 접두어와 와일드카드를 포함한 정규식이 될 수 있습니다.
      • 예를 들어 "classpath*:test.txt", "classpath*:test*.txt"가 될 수 있습니다.
  • 표준 ApplicationContext 인터페이스의 기본 ResourceLoader는 ResourcePatternResolver 인터페이스의 구현체는 PathMatchingResourcePatternResolver의 인스턴스입니다.

 

2. ResourcePatternResolver.getResources 예제

@SpringBootTest
public class ResourceLoaderApplicationTest {
    @Qualifier("webApplicationContext")
    @Autowired
    private ApplicationContext ctx;
    
    ...
    
    @Test
    public void getResourcesTest() throws IOException {
        Resource[] resources = ctx.getResources("classpath*:/test*.txt");// test 이름을 시작하는 txt파일들을 가져옴
        for(Resource resource : resources){
            String content = Files.readString(Path.of(resource.getURI()));
            System.out.println(content);
        }
    }
}

위 예제의 내용은 resources 디렉토리(클래스 패스)에 있는 test로 시작하는 txt파일을 가져와서 파일 내용을 출력하는 예제입니다. 실행 결과는 다음과 같습니다.

test.txt의 첫번째 줄
test.txt의 두번째 줄
test.txt의 세번째 줄

test2.txt의 첫번째 줄
test2.txt의 두번째 줄
test2.txt의 세번째 줄

위 예제에서 주목할점은 ApplicationContext 인터페이스가 ResourcePatternResolver 인터페이스를 상속받았기 때문에 getResources 메서드를 호출할 수 있었고 파일 경로로써 접두어인 "classpath*:"와 와일드 카드(test*.txt)를 사용했음을 볼 수 있습니다.

 

References

https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#resources-resourcepatternresolver
source code : https://github.com/yonghwankim-dev/spring_study/blob/master/resource_loader/src/test/java/kr/yh/ResourceLoaderApplicationTest.java