AWS S3와 스프링부트 연동하기

변현섭·2023년 6월 23일
1
post-thumbnail

이전 포스팅을 읽지 않으신 분들은 반드시 이전 포스팅의 내용을 숙지하고 아래의 내용을 읽어주세요.
>> 이전 포스팅

1. Access key와 Secret key 발급받기

S3를 스프링 부트에서 사용하려면 AWS 계정의 액세스 키와 비밀 키를 사용하여 인증해야 한다. 이러한 액세스 키와 비밀 키는 AWS IAM(Identity and Access Management)을 통해 발급받을 수 있다.

① AWS에 접속한 후 IAM 서비스로 들어간다.

② IAM의 좌측 메뉴 > 사용자를 클릭하고 사용자 추가를 눌러준다.

③ 아래와 같이 입력하고 다음을 눌러준다.

④ 직접 정책 연결을 선택한다.

⑤ 권한 정책에서 S3를 검색한 후 AmazonS3FullAccess를 체크한다.

⑥ 선택사항은 모두 건너뛰고 사용자 생성을 눌러주면 된다.

⑦ 방금 생성한 사용자를 클릭한 후 보안 자격 증명 메뉴로 들어간다. 스크롤을 조금만 내려 액세스 키 만들기를 눌러준다.

⑧ 본인의 필요에 맞게 선택한다. 여기서는 일단 AWS 외부에서 실행되는 애플리케이션을 선택하기로 한다.

⑨ 설명 태그는 선택사항이니 넘어가주도록 한다.

⑩ .csv파일을 다운로드 받는다. 이 때가 아니면 다시는 볼 수 없으니 다운을 받거나 복사해두어야 한다.

이로써 Access Key와 Secret Key의 발급이 모두 완료된다.

S3의 secret key가 외부에 노출되지 않도록 주의해야 한다. 블로그에 업로드하거나, github에 yml 파일을 함께 업로드 할 경우, 해킹의 대상이 될 수 있다. 주로 해당 아이디로 비트 코인을 채굴한다고 하는데, 이로 인해 해당 아이디의 주인은 막대한 요금을 지불해야 할 수도 있는만큼 주의해야 할 부분이다. (물론, AWS에서 유출을 자동으로 감지하여 알아서 Blocking 해주긴 하지만, 사용자가 직접 주의하는 것이 제일 좋다.) 비단 S3의 secret key 뿐 아니라, EC2의 프라이빗 IP, RDS의 엔드포인트 및 비밀번호 등도 외부에 유출되지 않도록 주의해야 한다.

2. Spring Boot로 S3에 파일 업로드하기

1) yml 파일

.yml은 아래와 같이 작성되어야 한다. 아래에 {AccessKey}와 {SecretKey}라고 되어있는 부분에 ⑩번에서 생성한 access-key와 secret-key 값을 넣어주어야 한다.(중괄호는 넣지 않는다. 구분을 위해 작성된 것이다.)

spring:
  servlet:
    multipart:
      max-request-size: 30MB
      max-file-size: 30MB
  datasource:
    url: jdbc:mysql://{RDS엔드포인트}:3306/{초기데이터베이스 이름}?userSSL=false&useUnicode=true&serverTimezone=Asia/Seoul&autoReconnect=True
    username : root
    password : {비밀번호}
    driver-class-name: com.mysql.cj.jdbc.Driver

  jpa:
    show-sql: true
    generate-ddl: true
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
        format_sql: true
cloud:
  aws:
    s3:
      bucket: {버킷이름}
    region:
      static: ap-northeast-2
    stack:
      auto: false
    credentials:
      access-key: {AccessKey}
      secret-key: {SecretKey}

2) S3Cofig 클래스


① @Value

  • 외부 설정 파일이나 환경 변수의 값을 읽어와 해당 필드에 주입하는 역할을 수행한다.
  • accessKey와 secretKey는 외부에 드러나면 안되므로, 설정파일에 실제 값을 두고, 그 값을 주입하는 형식으로 사용한다.
  • ${}로 감싸진 부분은 프로퍼티 표현식(Property Expression)으로, 설정파일에서 해당 속성에 대한 속성 값을 찾아서 주입한다.
  • 즉, yml파일의 cloud > aws > credentials > access-key 계층구조에 존재하는 속성 값이 accessKey에 주입된다.
  • secretKey와 region의 경우도 동일하다.

② @Bean

  • 스프링 빈 구성을 위한 메서드를 정의하는 역할을 수행한다.
  • 이 어노테이션이 붙은 객체는 스프링 컨테이너에 의해 관리된다.
  • 이 메서드는 AmazonS3 객체를 생성하여 반환한다.
  • 메서드 이름인 amazonS3Client()는 빈의 이름이 된다.
  • 빈의 이름은 빈을 식별하고 다른 컴포넌트에서 주입할 때 사용된다.
  • 사실 위에 @Configuration이라는 어노테이션이 있기 때문에 @Bean을 생략하더라도 이 메서드의 반환객체는 스프링 빈으로 자동 등록된다.

    ※ @Configuration
    이 어노테이션이 클래스에 적용되면, 해당 클래스는 스프링의 설정 파일 역할을 수행한다. 스프링은 @Configuration 어노테이션이 적용된 클래스를 스캔하여 컨테이너에 등록되는 빈(Bean) 설정 정보로 사용한다.

③ AmazonS3

  • AmazonS3는 인터페이스이고, AmazonS3Client가 구체클래스이다.
  • AmazonS3Client는 AWS S3 서비스와 상호 작용하기 위한 클라이언트 클래스이다

④ AWSCredentials 객체

  • AWS 자격 증명(AWS Credentials)을 나타내는 객체이다.
  • accessKey, secretKey, region 필드로부터 값을 가져와서 AWSCredentials 객체를 생성하고 있다.
  • BasicAWSCredentials는 AWSCredentials인터페이스의 구체클래스로, 다형성을 활용해 객체를 생성하고 있다.

⑤ AmazonS3ClientBuilder

  • AWS S3 서비스에 대한 클라이언트를 구성하고 빌드하기 위한 빌더 클래스이다.
  • standard() 메서드를 호출하여 기본 빌더를 생성한 뒤, 자격 증명 객체와 region을 지정한다.
  • build() 메서드를 호출하여 AmazonS3 객체를 생성하여 반환한다.

이번 시간에는 S3관련 설정에 대해서 다루어 보았다. 다음시간에는 S3에 대한 Service와 Repository, Controller에 대한 코드를 배워보기로 하자.

profile
Java Spring, Android Kotlin, Node.js, ML/DL 개발을 공부하는 인하대학교 정보통신공학과 학생입니다.

0개의 댓글