Skip to content

Commit

Permalink
Merge pull request #43 from Korea-Certified-Store/feature/set-dev-gcs(#…
Browse files Browse the repository at this point in the history
…40)

�GCS 설정
  • Loading branch information
jinhoon227 authored Jan 15, 2024
2 parents 49eae63 + 0ca98c7 commit 695ab4d
Show file tree
Hide file tree
Showing 7 changed files with 117 additions and 2 deletions.
3 changes: 2 additions & 1 deletion .github/workflows/action-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,8 @@ jobs:
run: chmod +x gradlew

- name: Test with Gradle
run: ./gradlew test
run: ./gradlew test --full-stacktrace

# 또한, Github Actions 상에서는 머신의 IP 주소를 특정할 수가 없어서 도로명 주소 API 사용이 불가능하기 때문이 이와 관련된 테스트도 Skip!
# 테스트 후 Result를 보기위해 Publish Unit Test Results step 추가
- name: Publish Unit Test Results
Expand Down
4 changes: 4 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,10 @@ dependencies {
// 확장자를 읽어들이기 위해 추가
implementation group: 'commons-io', name: 'commons-io', version: '2.4'

// for GCS
implementation group: 'org.springframework.cloud', name: 'spring-cloud-gcp-starter', version: '1.2.8.RELEASE'
implementation group: 'org.springframework.cloud', name: 'spring-cloud-gcp-storage', version: '1.2.8.RELEASE'

// JsonParser를 사용하기 위해 추가
dependencies { implementation 'com.google.code.gson:gson:2.8.8' }

Expand Down
32 changes: 32 additions & 0 deletions src/main/java/com/nainga/nainga/domain/gcsguide/GcsConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.nainga.nainga.domain.gcsguide;

import com.google.auth.oauth2.GoogleCredentials;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.ResourceUtils;

import java.io.IOException;
import java.io.InputStream;

@Configuration
public class GcsConfig {

@Bean
public Storage storage() {
String keyFileName = "backend-submodule/kcs-dev-gcs.json";
Storage storage;
try {
InputStream keyFile = ResourceUtils.getURL("classpath:" + keyFileName).openStream();
storage = StorageOptions.newBuilder()
.setCredentials(GoogleCredentials.fromStream(keyFile))
.build()
.getService();
} catch (IOException e) {
throw new IllegalArgumentException("GCS 에러");
}

return storage;
}
}
26 changes: 26 additions & 0 deletions src/main/java/com/nainga/nainga/domain/gcsguide/GcsController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.nainga.nainga.domain.gcsguide;

import com.nainga.nainga.global.util.Result;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
public class GcsController {

private final GcsService gcsService;

@Tag(name = "GCS")
@Operation(summary = "GCS 접속", description = "GCS 에 이미지 저장!")
@PostMapping(value = "api/v1/gcs",
consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public Result<String> saveImageToGCS(@ModelAttribute GcsResponse response) {
String url = gcsService.uploadImage(response);
return new Result<>(Result.CODE_SUCCESS, Result.MESSAGE_OK, url);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.nainga.nainga.domain.gcsguide;

import lombok.Data;
import org.springframework.web.multipart.MultipartFile;

@Data
public class GcsResponse {
private MultipartFile image;
}
43 changes: 43 additions & 0 deletions src/main/java/com/nainga/nainga/domain/gcsguide/GcsService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.nainga.nainga.domain.gcsguide;


import com.google.cloud.storage.Blob;
import com.google.cloud.storage.BlobInfo;
import com.google.cloud.storage.Storage;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.io.IOException;
import java.util.UUID;

@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class GcsService {

private final Storage storage;

public String uploadImage(GcsResponse response) {

// 이미지 업로드
String bucketName = "kcs-dev-bucket";
String uuid = UUID.randomUUID().toString(); // Google Cloud Storage에 저장될 파일 이름(중복 이름 안되게 저장하도록 주의)
String ext = response.getImage().getContentType(); // 파일의 형식 ex) JPG

// Cloud에 이미지 업로드
// 이미지 접근 url : https://storage.googleapis.com/버킷이름/UUID값
try {
BlobInfo blobInfo = BlobInfo.newBuilder(bucketName, uuid)
.setContentType(ext)
.build();

// Cloud 에 업로드
Blob blob = storage.create(blobInfo, response.getImage().getBytes());
} catch (IOException e) {
throw new IllegalArgumentException("GCS 에러");
}

return "https://storage.googleapis.com/" + bucketName + "/" + uuid;
}
}
2 changes: 1 addition & 1 deletion src/main/resources/backend-submodule

0 comments on commit 695ab4d

Please sign in to comment.