공부한 기록/백엔드

Google Cloud Storage + Spring boot - 이미지 파일

YongE 2024. 3. 8. 13:34

팀 프로젝트에서 메인 기능 내에 이미지 처리를 포함하려고 했다. 사용자의 설문 조사 정보를 받아서 그에 맞는 식단을 이미지와 함께 제공한다.

 

필자는 이번에 진행하는 프로젝트가 첫경험이기 때문에 하나하나 배워야 했다.

 

가장 처음 떠오른 의문은 이렇다.

 

이미지를 어디에 저장할 것인가?

 

다행이 이 의문에 대한 답은 다음 글에 잘 나와 있다.

 

 

https://hs-archive.tistory.com/42

 

이미지는 어디에 저장해야 할까

웹 서비스를 만들다 보면 이미지를 저장해야 할 때가 오는데 이미지는 어디에 저장해야 될까요? 얻어갈 지식 이미지 저장은 어디에? 이미지 저장 웹 서비스를 만들다 보면 이미지를 저장해야 될

hs-archive.tistory.com

 

 

글의 내용을 요약하면 이렇다.

  1. 파일 시스템에 저장
    • 이미지 파일은 파일 시스템(disk)에 저장하고 DB에는 파일의 이름과 경로만 저장하는 것.
    • 추가적인 보안 필요.
  2. DB에 저장
    • 이미지 파일 자체를 DB에 저장하는 것.
    • DB 자체가 파일 시스템보다 비싸다. 또한 크기가 큰(용량이 큰) 이미지는 DB의 성능 저하를 초래한다.
  3. 서버에 파일 저장
    • 어플리케이션 서버(배포 서버)나 따로 외부 서버에 저장.
    • 어플리케이션 서버는 저장할 수 있는 파일 갯수가 한정될 수가 있다. 이는 성능에 부정적 영향을 줄 수도 있다. 외부 서버에 저장해놓는다면 백업과 복구가 쉬운데다 어플리케이션 서버의 안정성을 향상시킬 수 있다.

 

따라서 보통 외부 서버에 저장하는 것이 권장된다. 그렇다고 나머지 방법이 아예 쓰지 않는다는 것이 아니다. 저장할 파일의 크기나 종류에 따라서 얼마든지 나머지 방법을 선택할 수도 있다. JPEG 확장자의 이미지 파일을 3개밖에 사용하지 않는다면 DB나 배포 서버에 저장해놔도 충분하지 않겠는가?

 

그래서 외부 서버에 대해서 알아보려고 했는데 요즘은 클라우드 기반의 저장소를 이용한다고 한다. 그중 하나가 Google Cloud Storage다.

 

https://cloud.google.com/storage/docs/introduction?hl=ko

 

Cloud Storage 제품 개요  |  Google Cloud

의견 보내기 Cloud Storage 제품 개요 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 이 페이지에서는 Cloud Storage와 작동 방식을 간략하게 설명합니다. Cloud Storag

cloud.google.com

 

위의 google cloud storage에 대한 상세 내용이 나와있다. 

저장한 파일을 포함한 객체를 감싸는 컨테이너인 버킷에는 파일을 본질적으로 무제한 포함할 수 있다고 한다. 

이 클라우드 저장소를 이용해 특정 사용자에게만 액세스 권한을 줄 수도 있고, 보다 안정적이고 안전하게 파일을 다룰 수 있다.

 

 

간단한 환경설정 및 이미지 다루기(Spring boot)

 

이제 구글 클라우드를 써야 한다는 것을 알았다. 그럼 spring boot를 이용해서 구글 클라우드 저장소를 활용해보자.

 

..., 라고 말은 했지만 업로드나 메타데이터만 가져오는 작업은 구글링해보면 잘 나와있다.

 

이미 업로드된 이미지만 가져와서 사용할 것이라면 cloud storage에서 이미지 url만 가져오면 된다.

 

그러니 여기서 간단하게 cloud에 저장한 데이터의 URL만 가져오는 식으로 다뤄보겠다.

 

  • Cloud Storage에 환경변수를 설정해야 한다.

환경변수명은 bucket-name, 값은 각 버킷의 명칭

  • 아래와 같이 주소를 넣어서 활용한다.
String imgUrl = "https://storage.googleapis.com/" + bucket-name + "/" + "이미지의 명칭"

중복방지를 위해서 이미지 명칭 앞에 UUID 값을 추가하기도 한다.

 

  • 이미지 URL 변수를 전송한다.
@GetMapping("/img")
public String img(){
	return menu.getImgURL();
    }

 

728x90
반응형

'공부한 기록 > 백엔드' 카테고리의 다른 글

REST AP란?  (0) 2024.04.14