[Spring Boot] GCS로 이미지 파일 저장

Wonjun Seo·2023년 8월 9일
0

Cloud Storage Bucket 생성

1. Console로 이동

https://cloud.google.com/?hl=ko

2. Cloud Storage - 버킷으로 이동

3. 버킷 만들기

상단에 "만들기" 버튼 클릭

버킷 이름 지정후 위치는 Region -> asia-northeast3(서울)로 변경

그룹 프로젝트로 진행할 경우에는 "이 버킷에 공개 액세스 방지 적용" 체크 해제

저장된 이미지 파일의 링크를 클릭후 공개 URL을 복사후 접속하면 저장된 이미지를 확인할 수 있습니다.

4. 공개 액세스 적용

버킷 선택 -> 권한 탭으로 이동

5. 접근 권한 허용 및 key 파일 생성

IAM 및 관리자 -> 서비스 계정으로 이동

서비스 계정 만들기 클릭

이름은 springboot-storage-access로 하고 아래와 같이 입력해 만들어줬습니다.

키 만들기

만든 서비스 계정을 클릭하고서, 키 탭으로 이동해 키 추가를 클릭합니다.

생성된 json key 파일은 컴퓨터에 저장해둡니다.

Spring Boot 프로젝트 설정

build.gradle에 dependency 추가

implementation group: 'org.springframework.cloud', name: 'spring-cloud-gcp-starter', version: '1.2.5.RELEASE'
implementation group: 'org.springframework.cloud', name: 'spring-cloud-gcp-storage', version: '1.2.5.RELEASE'

application.properties 설정

spring.cloud.gcp.storage.credentials.location=classpath:{json key 파일 이름}.json
spring.cloud.gcp.storage.project-id={json 파일 안에 있는 project-id 값}

Security Configuration 설정

@Bean
public Storage storage() {
    return StorageOptions.getDefaultInstance().getService();
}

마지막으로 config 파일에 Storage를 Bean으로 등록해줍니다.

이미지 업로드

스프링 부트 설정이 완료되었다면 아래는 GCS에 이미지 파일을 저장하는 코드입니다.

public void saveBoardProfileImage(MultipartFile imageFile, long boardId) {
	String originalName = imageFile.getOriginalFilename();
	String ext = imageFile.getContentType();
	String uuid = UUID.randomUUID().toString();
	String fileName = uuid + "_" + originalName;
	String uploadPath = UPLOAD_PATH + uuid;
	
    // BUCKET_NAME = GCS에 등록된 버킷 이름
    // 파일은 https://storage.googleapis.com/{버킷_이름}/{UUID}를 통해 조회할 수 있음
	BlobInfo imageInfo = BlobInfo.newBuilder(BUCKET_NAME, uuid)
			.setContentType(ext)
			.build();	
		
	BlobInfo blobInfo = null;
	try {
		blobInfo = storage.create(
				imageInfo, imageFile.getInputStream()
		);
			
		ImageFileCreateDto dto = ImageFileCreateDto.builder()
				.originalName(originalName)
				.ext(ext)
				.uuid(uuid)
				.uploadPath(uploadPath)
				.fileName(fileName)
				.boardId(boardId)
				.build();
			
		fileRepository.save(dto.toEntity(dto));
			
	} catch (IOException e) {
		e.printStackTrace();
	}				
}

GCS에 저장된 이미지는 <img>의 src에 상단에 이미지 파일의 링크를 지정하면 불러올 수 있습니다.

이미지 삭제

import com.google.cloud.storage.Blob;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;

public class DeleteObject {
  public static void deleteObject(String projectId, String bucketName, String objectName) {
    
    String projectId = "프로젝트_ID";
    String bucketName = "Bucket_이름";
    String objectName = "삭제할 파일 이름";

    Storage storage = StorageOptions.newBuilder().setProjectId(projectId).build().getService();
    Blob blob = storage.get(bucketName, objectName);
    if (blob == null) {
      System.out.println("The object " + objectName + " wasn't found in " + bucketName);
      return;
    }

    Storage.BlobSourceOption precondition =
        Storage.BlobSourceOption.generationMatch(blob.getGeneration());

    storage.delete(bucketName, objectName, precondition);

    System.out.println("Object " + objectName + " was deleted from " + bucketName);
  }
}

Java에서 GCS에 등록되어 있는 이미지 파일을 삭제하기 위한 코드입니다.

References

https://choo.oopy.io/35bffd94-7a41-4cfa-812c-b8aaf148604a#8a30227b-da39-4889-a2f4-236b236f7705

https://cloud.google.com/storage/docs/samples/storage-delete-file?hl=ko#storage_delete_file-java

0개의 댓글