Spring Boot에서 S3를 설정하기 전에 AWS S3 버킷 생성 글 처럼 S3 버킷 생성과 버킷 정책 설정, 액세스 키(Access Key)를 발급받아야 합니다.
먼저, S3 관련 의존성을 추가합니다.
저 같은 경우는 다음과 같은 의존성을 추가했습니다.
implementation 'com.amazonaws:aws-java-sdk-s3:1.12.3'
이 의존성이 아니더라도 아래와 같은 의존성을 추가해도 괜찮은 것 같습니다.
implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE`
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에 업로드할 수 있도록 구현해 보겠습니다.
@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 파일을 업로드하는 코드를 보겠습니다.
@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 객체의 크기를 반환합니다.PutObjectRequest
생성자에는 버킷 이름, 파일 키, 입력 스트림 및 메타데이터가 전달됩니다.key(원본 파일 이름)
를 반환합니다.uploadFileToS3()
메서드에서 반환된 key를 이용하여 버킷에서 업로드한 파일을 얻어오고, pdf 파싱을 위해 파일의 데이터를 읽어옵니다.
파일을 업로드하게 되면 아래와 같이 S3 버킷 안에 업로드된 것을 확인할 수 있습니다.
이상으로 Spring Boot와 S3 연동과 S3 버킷에 파일을 업로드하는 것까지 해봤습니다.