[SpringBoot] 프로젝트 리소스 파일 가져오기
반응형

프로젝트를 진행하다 보면 ~/src/main/resources 폴더에 파일을 저장하고 가져와서 사용할 일이 있다. 이때 프로젝트를 빌드하게 되면 리소스 파일은 CLASS_PATH에 위치하게 된다.

따라서 로컬에서는 아래의 예시 코드로 실행해도 실행이 되지만. 실제로 빌드를 하고 배포를 했을 때는 에러가 발생한다.

...
fun getSheetService(): Sheets {
        return Sheets.Builder(
            GoogleNetHttpTransport.newTrustedTransport(),
            GsonFactory.getDefaultInstance(),
            HttpCredentialsAdapter(
                ServiceAccountCredentials.fromStream(FileInputStream("src/main/resources/spread-sheet-credential.json"))
                    .createScoped(listOf(SheetsScopes.SPREADSHEETS))
                    .createDelegated(spreadSheetServiceUserName)
            )
        ).setApplicationName(spreadSheetServiceApplicationName).build()
    }
...

 

따라서 아래와 같은 방법으로 리소스 파일을 가져와야 한다.

 

리소스 파일 가져오기

스프링에서는 CLASS_PATH엥 저장된 리소스 파일을 쉽게 가져올 수 있도록 ClassPathResource라는 클래스를 제공한다.

위에서 보여준 예시 코드를 아래와 같이 바꾸어 사용하면 에러를 해결할 수 있다.

...
fun getSheetService(): Sheets {
        // 리소스 파일 가져오기
        val resource = ClassPathResource("spread-sheet-credential.json")

        return Sheets.Builder(
            GoogleNetHttpTransport.newTrustedTransport(),
            GsonFactory.getDefaultInstance(),
            HttpCredentialsAdapter(
                ServiceAccountCredentials.fromStream(resource.inputStream)
                    .createScoped(listOf(SheetsScopes.SPREADSHEETS))
                    .createDelegated(spreadSheetServiceUserName)
            )
        ).setApplicationName(spreadSheetServiceApplicationName).build()
    }
...

 

위 예시에서 사용된 resource.inputStream외에도 여러가지 기능을 제공한다.

resource.file // 파일 객체
resource.filename // 파일 이름
resource.inputStream // InputStream 객체
resource.path // 파일 경로
resource.URL // URL 객체
resource.URI // URI 객체

 

반응형