1. 개요
Spring Framework는 파일 시스템, 클래스 경로, 웹 등 다양한 소스의 파일을 쉽게 읽고 쓸 수 있도록 ResourceLoader
추상화를 제공합니다. 잘 알려진 프로토콜 접두사를 사용해 리소스에 대한 URI를 지정하기만 하면 됩니다. 예를 들어 로컬 파일 시스템의 파일에 액세스하려면 file:/data/config.yaml
와 같은 URI를 지정합니다.
Spring 리소스 추상화 및 gs:
프로토콜 프리픽스를 사용하여 Cloud Storage에 저장된 파일에 액세스하는 Spring Boot 앱을 작성해 보겠습니다.
Cloud Shell과 Cloud SDK gcloud 명령줄 도구를 사용하면 됩니다.
학습할 내용
- Cloud Storage Spring Boot 시작 조건을 사용하는 방법
- Spring으로 Cloud Storage의 파일에 액세스하는 방법
- Spring의
Resource
및WritableResource
추상화 사용 방법
필요한 항목
- Google Cloud 프로젝트
- 브라우저(예: Chrome)
- Vim, Emacs, GNU Nano와 같은 표준 Linux 텍스트 편집기에 관한 기본 지식
Codelab을 어떻게 사용할 계획인가요?
<ph type="x-smartling-placeholder">HTML 및 CSS 웹 앱 빌드 관련 경험을 평가해 주세요.
귀하의 Google Cloud 서비스 사용 경험을 평가해 주세요.
<ph type="x-smartling-placeholder">2. 설정 및 요건
자습형 환경 설정
- Cloud Console에 로그인하고 새 프로젝트를 만들거나 기존 프로젝트를 다시 사용합니다. (Gmail 또는 G Suite 계정이 없으면 만들어야 합니다.)
모든 Google Cloud 프로젝트에서 고유한 이름인 프로젝트 ID를 기억하세요(위의 이름은 이미 사용되었으므로 사용할 수 없습니다). 이 ID는 나중에 이 Codelab에서 PROJECT_ID
라고 부릅니다.
- 그런 후 Google Cloud 리소스를 사용할 수 있도록 Cloud Console에서 결제를 사용 설정해야 합니다.
이 Codelab 실행에는 많은 비용이 들지 않습니다. 이 가이드를 마친 후 비용이 결제되지 않도록 리소스 종료 방법을 알려주는 '삭제' 섹션의 안내를 따르세요. Google Cloud 새 사용자에게는 미화 $300 상당의 무료 체험판 프로그램에 참여할 수 있는 자격이 부여됩니다.
Cloud Shell
Google Cloud에서 실행되는 명령줄 환경인 Cloud Shell을 사용합니다.
Cloud Shell 활성화
- Cloud Console에서 Cloud Shell 활성화를 클릭합니다.
이전에 Cloud Shell을 시작하지 않았으면 설명이 포함된 중간 화면(스크롤해야 볼 수 있는 부분)이 제공됩니다. 이 경우 계속을 클릭합니다(이후 다시 표시되지 않음). 이 일회성 화면은 다음과 같습니다.
Cloud Shell을 프로비저닝하고 연결하는 데 몇 분 정도만 걸립니다.
가상 머신은 필요한 모든 개발 도구와 함께 로드됩니다. 영구적인 5GB 홈 디렉터리를 제공하고 Google Cloud에서 실행되므로 네트워크 성능과 인증이 크게 개선됩니다. 이 Codelab에서 대부분의 작업은 브라우저나 Chromebook만 사용하여 수행할 수 있습니다.
Cloud Shell에 연결되면 인증이 완료되었고 프로젝트가 해당 프로젝트 ID로 이미 설정된 것을 볼 수 있습니다.
- Cloud Shell에서 다음 명령어를 실행하여 인증되었는지 확인합니다.
gcloud auth list
명령어 결과
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
gcloud config list project
명령어 결과
[core] project = <PROJECT_ID>
또는 다음 명령어로 설정할 수 있습니다.
gcloud config set project <PROJECT_ID>
명령어 결과
Updated property [core/project].
3. Cloud Storage에서 파일 만들기
Cloud Shell이 실행되면 파일을 만들고 Cloud Storage로 전송할 수 있습니다.
my-file.txt
이라는 파일을 만듭니다.
$ echo "Hello World from GCS" > my-file.txt
그런 다음 Cloud Storage에 고유한 새 버킷을 만들고 gsutil
를 사용하여 파일을 전송합니다.
$ BUCKET=spring-bucket-$USER $ gsutil makebucket gs://$BUCKET $ gsutil copy my-file.txt gs://$BUCKET
Cloud Storage의 스토리지 브라우저로 이동하여 버킷과 파일이 있는지 확인합니다.
4. Spring Boot 앱 초기화
명령줄을 사용하여 Spring Initializr로 새 Spring Boot 앱을 생성하는 앱 작성을 시작합니다.
$ curl https://start.spring.io/starter.tgz \ -d type=maven-project \ -d dependencies=web,cloud-gcp-storage -d baseDir=spring-gcs | tar -xzvf -
Initializr가 템플릿 앱의 pom.xml
에 있는 종속 항목에 spring-boot-starter-web
및 spring-cloud-gcp-starter-storage
를 자동으로 추가합니다.
템플릿 앱의 디렉터리로 변경합니다.
$ cd spring-gcs
JAVA_HOME
이 올바른 JDK 버전으로 설정되어 있는지 확인합니다.
$ export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/
Maven을 사용하여 앱을 빌드하고 실행합니다.
$ ./mvnw spring-boot:run
앱이 포트 8080에서 수신 대기를 시작합니다. 새 Cloud Shell 탭을 열고 curl
를 실행하여 앱에 액세스합니다.
$ curl localhost:8080
앱이 아직 유용한 작업을 수행하지 않으므로 404 응답이 표시됩니다.
앱이 실행 중인 이전 Cloud Shell 탭으로 돌아가서 Control+C
(Macintosh의 경우 Command+C
)를 사용하여 앱을 종료합니다.
5. Cloud Storage에서 파일 읽기
이전에 Cloud Storage에 저장한 파일인 my-file.txt
에 액세스하도록 Spring Boot 앱을 수정합니다. 목표는 단순히 HTTP를 통해 파일의 콘텐츠를 반환하는 것입니다.
다음 안내에서는 Vim을 사용하여 파일을 편집하지만 Emacs, GNU Nano 또는 Cloud Shell의 기본 제공 코드 편집기를 사용할 수도 있습니다.
$ cd ~/spring-gcs
앱에 REST 컨트롤러 GcsController
를 추가합니다.
$ vi src/main/java/com/example/demo/GcsController.java
다음 코드를 붙여넣고, 이전에 만든 버킷으로 리소스 URI를 수정해야 합니다. echo $BUCKET
명령어를 실행하여 버킷을 확인할 수 있습니다.
src/main/java/com/example/demo/GcsController.java
package com.example.demo;
import java.io.IOException;
import java.nio.charset.Charset;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.util.StreamUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class GcsController {
@Value("gs://REPLACE_WITH_YOUR_BUCKET/my-file.txt")
private Resource gcsFile;
@GetMapping("/")
public String readGcsFile() throws IOException {
return StreamUtils.copyToString(
gcsFile.getInputStream(),
Charset.defaultCharset());
}
}
Maven으로 앱을 빌드하고 실행합니다.
$ ./mvnw spring-boot:run
앱이 포트 8080에서 수신 대기를 시작합니다. 새 Cloud Shell 탭을 열고 curl
를 실행하여 앱에 액세스합니다.
$ curl localhost:8080
이제 앱에서 반환된 파일의 콘텐츠가 표시됩니다. 앱이 실행 중인 이전 Cloud Shell 탭으로 이동하여 Control+C
(Macintosh의 경우 Command+C
)를 사용하여 앱을 종료합니다.
6. Cloud Storage의 파일에 쓰기
Cloud Storage에서 파일의 콘텐츠를 읽고 Spring REST 컨트롤러를 통해 노출했습니다. 이제 새 파일 콘텐츠를 동일한 HTTP 엔드포인트에 게시하여 파일의 콘텐츠를 변경합니다.
HTTP POST에 응답하고 Cloud Storage의 파일에 데이터를 쓰는 GcsController
에 다른 메서드를 추가해야 합니다. 이번에는 Spring Resource
를 WritableResource
에 전송합니다.
필요한 추가 가져오기로 GcsController
를 업데이트합니다.
src/main/java/com/example/demo/GcsController.java
import java.io.OutputStream;
import org.springframework.core.io.WritableResource;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.PostMapping;
컨트롤러에 새 엔드포인트 메서드를 추가합니다.
src/main/java/com/example/demo/GcsController.java
@RestController
public class GcsController {
@PostMapping("/")
String writeGcs(@RequestBody String data) throws IOException {
try (OutputStream os = ((WritableResource) gcsFile).getOutputStream()) {
os.write(data.getBytes());
}
return "file was updated\n";
}
...
}
Maven으로 앱을 빌드하고 실행합니다.
$ ./mvnw spring-boot:run
앱이 포트 8080에서 수신 대기를 시작합니다. 새 Cloud Shell 탭을 열고 curl
를 실행하여 앱에 메시지를 게시합니다.
$ curl -d 'new message' -H 'Content-Type: text/plain' localhost:8080
파일 콘텐츠가 업데이트되었다는 확인 메시지가 표시됩니다. 그러나 GET
를 실행하여 확인합니다.
$ curl localhost:8080
앱에서 반환된 파일의 업데이트된 콘텐츠가 표시됩니다. 앱이 실행 중인 이전 Cloud Shell 탭으로 돌아가서 Control+C
(Macintosh의 경우 Command+C
)를 사용하여 앱을 종료합니다.
7. 축하합니다.
Spring Resource 추상화를 사용하여 Cloud Storage의 파일에 쉽게 액세스하는 방법을 알아봤습니다. Cloud Storage의 파일을 읽고 쓸 수 있는 Spring Boot 웹 앱을 작성했습니다. 이 기능을 지원하는 Cloud Storage의 Spring Boot 시작 조건에 대해서도 알아봤습니다.
자세히 알아보기
라이선스
이 작업물은 Creative Commons Attribution 2.0 일반 라이선스에 따라 사용이 허가되었습니다.