욜료가 서비스를 AWS 에서 운영하고 있어 이미지 서버도 AWS S3 로 선택하였다. 욜로가 서버에서 별도의 웹 서버를 설치하여 static 이미지를 관리해도 되지만, AWS 라는 클라우드 서비스를 최대한 활용하여 개발에 집중할 수 있도록 하였다. (또 현재 사용하는 EC2 사양이 프리티어에서 제공하는 기본으로 사용하기 때문에 성능이 매우 안좋다.. 😅)
S3 라는 별도의 이미지 서버를 사용함으로써 욜로가 서버로 오는 접근의 횟수를 줄일 수 있다. 만일 욜로가 서버에서 이미지도 관리하였다면, 사용자의 정보를 불러오고, 이미지도 불러오기 위해 한 번 더 접근해야 한다. 하지만 S3 를 사용하면서 이미지를 불러오는 과정은 S3 에게 위임하게 된다. 일반 데이터보다 상대적으로 크기가 큰 이미지 관련 기능을 분리하면서 욜로가 서버에 대한 부담을 줄일 수 있다.
Spring Framework 에서 S3 에 연결하기 위해서는 의존성으로 spring-cloud-starter-aws 를 사용한다. 하지만 Spring 공식 홈페이지에서 2020년 4월 17일에 발표된 내용에 따르면, 더 이상 Spring Cloud 에서 Spring Cloud GCP, Spring Cloud AWS 를 지원하지 않는다.(최신 버전으로 업데이트 되지 않는다.) 즉 Spring Cloud 의 의존성을 추가할 때 org.springframework.cloud 를 사용할 수 없다는 의미이다. org.springframework.cloud 대신 io.awspring.cloud
를 사용하도록 권장한다.
awspring 의 공식 깃허브에 따르면 스프링 버전에 따라 다음과 같은 버전을 사용하도록 요구한다.
나는 Spring 6, Spring Boot 3.0.1 을 사용하고 있으므로 Spring Cloud AWS 는 3.0.x 버전을 사용해야 한다.
하지만 2023년 2월 23일 기준 awspring 공식문서에 따르면 아직 3.0.x 버전은 정식으로 출시되지 않았다.. 아직 출시는 되지 않았지만 3.0.0 의 업데이트 이력을 보니 1월자에 RC 버전이 출시되어 이를 사용하기로 결정하였다.
dependencies {
implementation 'io.awspring.cloud:spring-cloud-aws-starter-s3:3.0.0-RC1'
}
(설치된 RC 버전의 의존성들…. 🥲)
S3 버킷에 접근하기 위한 방법으로 두 가지가 있다. 바로 S3Client 와 S3Template 이다.
먼저 S3Client 는 S3 버킷에 접근하는 API 들을 제공하는 인터페이스이다. createMultipartUpload(), deleteObejct() 등의 메서드를 이용하여 간단한 CRUD 기능을 구현할 수 있다. 특징으로는 S3Client 의 API 를 사용하기 위해서는 각 메서드에 맞는 객체를 생성해야 한다. 해당 객체에는 어느 S3 버킷(bucket) 의 어느 리소스(resource key) 에 접근할 것인지에 대한 정보를 작성한다.
S3Template 은 내부에 구현되어 있는 코드를 보면 S3Client 를 이용하여 기능을 구현한다는 것을 알 수 있다. S3Client 는 S3 에 접근하기 위한 필수 기능들만 정의되어 있었다면, S3Template 은 한단계 추상화하여 사용법이 더욱 간편하며 예외 처리도 포함되어 있다. 또한 S3Client 의 API 에서 필요로 하는 객체들을 내부에서 생성해주며, 메서드의 입력값으로 버킷과 resource key 를 받는 방식도 있지만, S3 에서 객체에 접근할 수 있는 URL
만으로도 메서드를 사용할 수 있어 간편하다.
application-aws.yml
spring:
cloud:
aws:
credentials:
access-key: {access-key}
secret-key: {secret-key}
region:
static: {region}
s3:
bucket: {bucket} # custom