ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [09] ApplicationContext - ResourceLoader
    Spring/Spring 핵심 기술 2020. 4. 21. 09:15
    반응형

    ResourceLoader는 이름과 같이 resource를 loading하는 기능을 제공하는 interface이며 ApplicationContext는 ResourceLoader를 상속받고 있어 ApplicationContext에서도 해당 기능을 사용할 수 있습니다.

    public interface ApplicationContext extends ResourcePatternResolver {
    	...
    }
    
    public interface ResourcePatternResolver extends ResourceLoader {
    	...
    }

     

    [resource 가져오기]

    ResourceLoader의 getResource() method는 Resource type의 객체를 반환 합니다. 다음은 getResource() method로 Resource 객체를 받고 Resource의 exists() method를 통해 resource의 존재여부를 확인하는 예제입니다. AppRunner class를 다음과 같이 수정하고 실행합니다.

    @Component
    public class AppRunner implements ApplicationRunner {
        @Autowired
        ResourceLoader resourceLoader;	//①
    
        @Override
        public void run(ApplicationArguments args) throws Exception {
            Resource resource =  resourceLoader.getResource("classpath:test.txt");	//②
            System.out.println(resource.exists());	//③
        }
    
    }

    ①resource를 loading하기 위해 ResourceLoader bean을 주입받습니다.

    ②classpath의 test.txt file을 resource로써 받아와서 Resource 객체로 반환 합니다.

    ③exists() method로 resource가 존재하는지 확인합니다.

     

    test.txt라는 resource는 현재 존재하지 않으므로 exists() method는 false를 return합니다.

     

    resources directory 아래에 test.txt file을 생성하고 project를 build하면 target directory 안으로 들어갑니다. 즉, classpath에 들어가게 됩니다. 

     

    따라서 위의 코드를 다시 실행해보면 존재하는 resource이므로 exists() method가 true를 return하게 됩니다.

     

     

     

     

    [Resource 객체의 method]

    exists() : resource가 있으면 true 없으면 false를 return합니다.

    isFile() : resource가 file인지 확인합니다.

    getFile() : file을 읽어옵니다.

    isOpen() : resource가 열려있는지 확인합니다.

    isReadable() : 읽을 수 있는 resource인지 확인합니다.

    getDescription() : resource를 사용한 작업 시 error를 출력하기 위해 사용되는 resource에 대한 설명을 return 합니다.

     

    @Component
    public class AppRunner implements ApplicationRunner {
        
        @Autowired
        ResourceLoader resourceLoader;
        
        @Override
        public void run(ApplicationArguments args) throws Exception {
            
            Resource resource =  resourceLoader.getResource("classpath:test.txt");
            
            System.out.println("exists() -> " + resource.exists());
            System.out.println("isFile() -> " + resource.isFile());	//①
            System.out.println("isReadable() -> " + resource.isReadable());	//②
            System.out.println("isOpen() -> " + resource.isOpen());	//③
            System.out.println("getFile() -> " + resource.getFile());	//④
            System.out.println("getDescription() -> " + resource.getDescription());	//⑤
        }
    }

    ①test.txt는 file resource이므로 true를 반환합니다. 

    ②test.txt는 읽을 수 있는 resource이므로 true를 반환합니다.

    ③test.txt resource는 열려있지 않은 상태이므로 false를 반환합니다.

    ④file의 path를 반환합니다.

    ⑤resource의 description(path 종류, resource 이름)을 반환합니다.

     

     

     

     

    [file resource test.txt의 내용을 출력]

    text.txt file의 내용을 읽어와 콘솔에 출력하는 예제입니다. java8, java11에 대해 작성하였습니다.

    @Component
    public class AppRunner implements ApplicationRunner {
    
        @Autowired
        ResourceLoader resourceLoader;
    
        @Override
        public void run(ApplicationArguments args) throws Exception {
    
            Resource resource =  resourceLoader.getResource("classpath:test.txt");
    
            //For java13
            System.out.println(Files.readString(Path.of(resource.getURI())));
    
            //For java8
            BufferedReader bReader = null;
    
            try {
    
                String s;
                File file = resource.getFile();
                bReader = new BufferedReader(new FileReader(file));
    
                // 더이상 읽어들일게 없을 때까지 읽어들이게 합니다.
                while((s = bReader.readLine()) != null) {
                    System.out.println(s);
                }
            } catch(IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if(bReader != null) bReader.close();
                } catch(IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

     

    댓글

Designed by Tistory.