Spring Boot S3 연동

Moon·2023년 5월 25일
0

AWS

목록 보기
7/7
post-thumbnail
post-custom-banner

Spring Boot에서 S3를 설정하기 전에 AWS S3 버킷 생성 글 처럼 S3 버킷 생성과 버킷 정책 설정, 액세스 키(Access Key)를 발급받아야 합니다.

먼저, S3 관련 의존성을 추가합니다.

📌 build.grdle 의존성 추가

저 같은 경우는 다음과 같은 의존성을 추가했습니다.

implementation 'com.amazonaws:aws-java-sdk-s3:1.12.3'

이 의존성이 아니더라도 아래와 같은 의존성을 추가해도 괜찮은 것 같습니다.

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

📌 application.yml 설정

cloud:
  aws:
    region:
      static: ap-northeast-2
    credentials:
      access-key: [발급받은 액세스 키]
      secret-key: [발급받은 시크릿 키]
    s3:
      bucket: [버킷 이름]

버킷을 생성했을 때, 설정한 이름과 IAM을 추가하면서 발급받은 액세스 키시크릿 키application.yml 파일에 정보를 작성합니다.

💡 위와 같은 정보들은 Github에 절대 push하시면 안됩니다!

여기까지 Spring Boot에서 AWS S3를 사용하기 위한 설정이였습니다.

이제는 PDF같은 파일들을 S3에 업로드할 수 있도록 구현해 보겠습니다.


📌 S3Config

@Configuration
public class S3Config {

    @Value("${cloud.aws.credentials.access-key}")
    private String accessKey;
    @Value("${cloud.aws.credentials.secret-key}")
    private String secretKey;
    @Value("${cloud.aws.region.static}")
    private String region;

    @Bean
    public AmazonS3 amazonS3Client() {
        AWSCredentialsProvider awsCredentialsProvider = new AWSStaticCredentialsProvider(
                new BasicAWSCredentials(accessKey, secretKey));
        return AmazonS3ClientBuilder.standard()
                .withRegion(region)
                .withCredentials(awsCredentialsProvider)
                .build();
    }
}
  • 바로 전에 application.yml에 S3 및 IAM에 대한 설정을 완료했습니다. 이제 이 설정 값들을 연결할 필요가 있습니다.

  • 설정 값들을 @Value를 통해 불러옵니다.

  • S3 관련 의존성에서 제공하는 AmazonS3를 이용하여 파일들을 업로드하는데, 설정 값들을 amazonS3Client() 메서드를 통해 등록합니다.

이제 PDF 파일을 업로드하는 코드를 보겠습니다.

📌 PDF 파일 업로드

@Service
@RequiredArgsConstructor
public class PdfParsingImpl implements PdfParsingService {

	private final ResponseService responseService;
    
    private final AmazonS3 amazonS3Client;

    @Value("${cloud.aws.s3.bucket}")
    private String bucket;
    
    ...

    @Override
    public CommonResponse pdfParsing(MultipartFile multipartFile) throws IOException, PDFValidationException {

        String fileExtension = "";
        try {
            String fileName = multipartFile.getOriginalFilename();
            fileExtension = Objects.requireNonNull(fileName).substring(fileName.lastIndexOf(".") + 1);
        } catch (NullPointerException e) {
            return responseService.getFailResponse(400, "파일이 없거나 잘못된 접근입니다.");
        }

        if (fileExtension.equals("pdf")) {
            String key = uploadFileToS3(multipartFile);
            S3Object s3Object = amazonS3Client.getObject(bucket, key);
            InputStream inputStream = s3Object.getObjectContent();

			// pdf 파싱
         	...
            
         } else {
            return responseService.getFailResponse(404, "파일형식이 잘못되었습니다");
        }
    }
    
     public String uploadFileToS3(MultipartFile multipartFile) {
        String key = multipartFile.getOriginalFilename();
        InputStream inputStream;
        try {
            inputStream = multipartFile.getInputStream();
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentLength(multipartFile.getSize());
            amazonS3Client.putObject(new PutObjectRequest(bucket, key, inputStream, metadata));
        } catch (IOException e) {
            throw new PDFValidationException();
        }
        return key;
    }   
  • S3관련 인터페이스인 AmazonS3와 application.yml에 설정한 버킷 이름을 @Value를 통해 불러옵니다.

  • pdf 파일인 MultipartFile을 입력받으면 그 파일이 pdf 확장자가 맞는 지 파일 이름을 얻어와서 검사할 필요가 있습니다. 확장자가 pdf가 아니면 다른 응답을 반환합니다.

  • uploadFileToS3() 메서드는 S3에 파일을 업로드 하는 역할을 합니다. 관련된 코드들을 한 줄씩 설명해 보겠습니다.

    • 객체에서 원본 파일 이름을 가져와 key 변수에 저장합니다. 이 키는 S3에서 업로드된 파일을 구분하기 위해 사용됩니다.
    • MultipartFile 객체에서 InputStream을 가져와 inputStream 변수에 저장합니다. 이 스트림은 파일 데이터를 읽을 수 있는 스트림입니다.
    • ObjectMetadata 객체를 생성합니다. 이 객체는 업로드된 파일의 메타데이터를 나타냅니다.
    • ObjectMetadata 객체의 setContentLength() 메서드를 사용하여 업로드된 파일의 크기를 설정합니다. getSize() 메서드는 MultipartFile 객체의 크기를 반환합니다.
    • amazonS3Client를 사용하여 S3 버킷에 파일을 업로드합니다. PutObjectRequest 생성자에는 버킷 이름, 파일 키, 입력 스트림 및 메타데이터가 전달됩니다.
    • 마지막으로 업로드된 파일의 key(원본 파일 이름)를 반환합니다.
  • uploadFileToS3() 메서드에서 반환된 key를 이용하여 버킷에서 업로드한 파일을 얻어오고, pdf 파싱을 위해 파일의 데이터를 읽어옵니다.

파일을 업로드하게 되면 아래와 같이 S3 버킷 안에 업로드된 것을 확인할 수 있습니다.

이상으로 Spring Boot와 S3 연동과 S3 버킷에 파일을 업로드하는 것까지 해봤습니다.

profile
꾸준함으로 성장하는 개발자 지망생
post-custom-banner

0개의 댓글