Published on

spring boot awspring 마이그레이션

Authors
  • avatar
    Name
    Yoon Woo jun
    Twitter

소개

많은 분들이 spring boot 에서 aws의 서비스를 연결하기 위해서 관련 라이브러리를 사용하고 있습니다.
관련 블로그 글이나 참고자료에서 많이들 쓰고있는 라이브러리는 spring-cloud-starter-aws 의 2.x.x 버전입니다.
또는, spring-cloud-aws 의 다른 버전을 사용하고 있습니다.

implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'
240829-013306

하지만, Maven Repository에서 해당 버전은 21년 이후로 업데이트 되지 않고 있습니다.
또한, Intellij IDEA를 사용하고 계신다면, 보안 이슈 경고가 확인할 수 있습니다.
그래서, 2.2.6 버전에서 바로 최신버전인 3.1.1의 awspring 라이브러리로 마이그레이션을 진행하기로 했습니다.

awspring 마이그레이션

build.gradle
implementation platform("io.awspring.cloud:spring-cloud-aws-dependencies:3.1.1") // BOM
- implementation('io.awspring.cloud:spring-cloud-aws-starter')
- implementation('io.awspring.cloud:spring-cloud-aws-s3')
+ implementation('io.awspring.cloud:spring-cloud-aws-starter-s3')

진행중인 프로젝트는 S3 Presigend URL 발급 로직이 필요하기 때문에 S3 의 경우로 진행했습니다.
BOM을 implementation 함으로써 다른 라이브러리의 종속성의 버전을 맞출 필요가 없습니다.
또한, 공식 문서를 참고하면, starter와 s3 합쳐서 사용할 수 있다 나와있습니다.
공식문서는 여기서 확인할 수 있습니다.

starter를 사용함으로써 aws 계정 정보를 기본적으로 application.yaml을 통해 주입할 수 있습니다.

spring:
  cloud:
    aws:
      credentials:
        access-key: access-key
        secret-key: secret-key
      s3:
        enabled: true
        bucket: s3-bucket-name
      region:
        static: region # like ap-northeast-2

여기서 주의할 부분은 첫번째로, enabled를 true로 주지 않으면 안된다는 점입니다.

두번째로는 로컬 환경에서 테스트할 때 aws cli 를 로그아웃하고 하는 것입니다.
로컬 환경에서 aws cli로 로그인을 해 계정 정보가 남아있고, application.yaml에 문제가 생기면, 자동으로 우선적으로 수행되어
application.yaml에 문제가 발생했는지 파악하지 못하고 배포하게 되기 때문입니다.
즉, ~/.aws/config 의 값을 우선적으로 받게됩니다. 해당 파일을 지우고 진행하길 권장드립니다.

그리고, 꼭 위와같이 계정 정보를 넣을 필요는 없습니다.
공식문서의 다양한 CredentialsProvider를 통해서 구현하실 수도 있습니다. 따로 위처럼 설정하지 않으시면, DefaultCredentialsProvider로 계정 정보를 받습니다.

마이그레이션 마무리

여기까지 진행하면, 마이그레이션을 끝났습니다.
따로, S3Config.java 와 같은 클래스를 구현할 필요 없이 초기 세팅은 이렇게 끝입니다.

starter 와 s3 라이브러리를 같이 씀으로써 S3Template이라는 강력한 기능도 사용할 수 있습니다.

Presigend URL을 S3Template으로 발급받는 로직을 다음과 같이 구현할 수 있습니다.

public String getPresignedUrl(String prefix, String fileName) {
    String generatedFileName = generateFileName(prefix, fileName);
    URL presignedUrl = s3Template.createSignedPutURL(bucket, generatedFileName, generateExpiration());
    return presignedUrl.toString();
}

generateFileName 메서드는 버킷에 중복된 이름의 파일이 올라가지 않도록 하기위한 메서드이고,
createSignedPutURL 메서드의 파라미터는 각각 버킷 이름, 업로드할 파일의 이름 및 경로, presignedUrl 만료 시간 (Duration) 입니다.

그 외에 upload, download, bucket 삭제 생성 등 다양한 메서드를 S3Template로 수행하실 수 있습니다.
한번 S3Template를 들어가보면 대강 어떤 메서드를 사용할 수 있을지 알 수 있습니다.

읽어주셔서 감사합니다. 궁금하신점은 댓글로 최대한 아는선에서 답변해드리겠습니다.