프로젝트를 하다 보면 항상 파일을 다룰 때가 발생한다. 이미지 등 파일을 다룰 때에는 주로 RDBMS가 아닌 S3와 같은 오브젝트 스토리지에 저장을 하게 되는데 그 이유는 다음과 같다.
1. 오브젝트 스토리지가 훨씬 저렴함
2. 이미지 등 파일 접근 방식이 간단함
3. 대용량 파일 입출력에 최적화
따라서 파일을 다룰 때에는 주로 클라우드 오브젝트 스토리지에 업로드를 하고, 해당 객체의 URI를 DB에 저장하는 방식을 주로 사용한다. Spring JPA에서 엔티티로 관리하면서 동시에 오브젝트 스토리지에 업로드된 객체를 조회할 수 있기 때문.
이번 게시글에서는 Spring Boot에서 GCP의 S3에 해당하는 GCS(Google Cloud Storage)에 파일을 업로드하는 방법에 대해 다루고자 한다.
먼저 개발 중인 환경은 다음과 같다.
- Google Cloud Platform 사용
- Java 17, Spring Boot 3.2.4
build.gradle
dependencies {
// 최신 라이브러리
implementation 'com.google.cloud:google-cloud-storage:2.39.0'
}
application.yml
spring:
cloud:
gcp:
storage:
credentials:
location: classpath:credentials.json위치
project-id: GCP 프로젝트 아이디
bucket: GCS 버킷명
StorageConfig.java
@Configuration
public class StorageConfig {
@Value("${spring.cloud.gcp.storage.credentials.location}")
private String keyFileLocation;
@Bean
public Storage storage() throws IOException {
InputStream keyFile = ResourceUtils.getURL(keyFileLocation).openStream();
return StorageOptions.newBuilder()
.setCredentials(GoogleCredentials.fromStream(keyFile))
.build()
.getService();
}
}
Cloud Storage에 연결할 때 필요한 인증 정보를 application.yml에서 읽어와 Storage 객체를 생성한다.
DataBucketUtil.java
@Component
@RequiredArgsConstructor
public class DataBucketUtil {
@Value("${spring.cloud.gcp.storage.bucket}")
private String bucketName;
private final Storage storage;
public String uploadImage(MultipartFile file) throws IOException {
// 이미지 uuid와 파일 형식
String uuid = UUID.randomUUID().toString();
String ext = file.getContentType();
log.info("uuid: {}, ext: {}", uuid, ext);
// Google Cloud Storage에 이미지 업로드
BlobInfo blobInfo = BlobInfo.newBuilder(bucketName, uuid)
.setContentType(ext)
.build();
log.info("blobInfo: {}", blobInfo);
Blob blob = storage.create(blobInfo, file.getBytes());
log.info("blob: {}", blob);
return bucketName + "/" + uuid;
}
}
일단 Controller 단에서 MultipartFile을 입력받았을 때를 가정하고 작성된 코드인데, 만약 Spring 내부에서 자체적으로 생성된 파일이라면 byte[] file로 파라미터를 받으면 된다.
다음 글에서는 이미지를 입력받아 GCS에 업로드하고, 이미지 객체를 생성해 DB에 저장하는 방법을 다루고자 한다.
'개발 > Spring' 카테고리의 다른 글
[Spring] Spring Boot에서 Google Cloud Storage(GCS)에 파일 업로드하기 - 2 (0) | 2024.05.23 |
---|---|
[Spring] Spring Boot에서 SendGrid로 이메일 전송하기 - 3 (1) | 2024.05.21 |
[Spring] Spring Boot에서 SendGrid로 이메일 전송하기 - 2 (0) | 2024.05.21 |
[Spring] Spring Boot에서 SendGrid로 이메일 전송하기 - 1 (0) | 2024.05.21 |