유효 기간 생성, URL Request 생성, Presigned URL 생성의 3가지 일을 하는 generatePresignedURL()
단일 함수를 유효 기간 설정 함수 getExpiration()
, URL Request 생성 함수 generatePresignedUrlRequest()
, 그리고 Presigned URL 생성 generatePresignedURL()
함수로 분리하여, 함수가 하나의 작업만 하도록 분리하였음
함수의 가독성이 올라가 어떤 로직으로 함수와, 함수들이 작동하는지 쉽게 파악이 가능해졌음
https://github.com/Whiteboard-Journey/asyncrum-backend/pull/41
클린코드: 3장 함수 - 한 가지만 해라!
/**
* S3 Presigned URL 생성
*/
public String generatePresignedURL(String uploadFileKey, String dirName, FileType fileType) {
try {
// Set the presigned URL to expire after 2 mins
Date expiration = new Date();
long expTimeMillis = Instant.now().toEpochMilli();
expTimeMillis += 1000 * 60 * 2;
expiration.setTime(expTimeMillis);
// Generate the presigned URL Request
GeneratePresignedUrlRequest generatePresignedUrlRequest =
new GeneratePresignedUrlRequest(bucket, buildFileName(uploadFileKey, dirName))
.withContentType(fileType.getContentType())
.withMethod(HttpMethod.PUT)
.withExpiration(expiration);
// Add ACL
generatePresignedUrlRequest.addRequestParameter(Headers.S3_CANNED_ACL, CannedAccessControlList.PublicRead.toString());
// Generate the presigned URL
URL preSignedURL = amazonS3Client.generatePresignedUrl(generatePresignedUrlRequest);
log.info("Pre-Signed URL: " + preSignedURL.toString());
return preSignedURL.toString();
} catch (AmazonServiceException e) {
// The call was transmitted successfully, but Amazon S3 couldn't process
// it, so it returned an error response.
e.printStackTrace();
}
return null;
}
/**
* S3 Presigned URL 생성
*/
public String generatePresignedURL(String uploadFileKey, String dirName, FileType fileType) {
try {
GeneratePresignedUrlRequest generatePresignedUrlRequest = generatePresignedUrlRequest(uploadFileKey, dirName, fileType);
URL preSignedURL = amazonS3Client.generatePresignedUrl(generatePresignedUrlRequest);
return preSignedURL.toString();
} catch (AmazonServiceException e) {
e.printStackTrace();
return null;
}
}
/**
* Presigned URL Request 생성
*/
private GeneratePresignedUrlRequest generatePresignedUrlRequest(String uploadFileKey, String dirName, FileType fileType) {
// 유효 기간 설정
Date expiration = getExpiration();
GeneratePresignedUrlRequest generatePresignedUrlRequest =
new GeneratePresignedUrlRequest(bucket, buildFileName(uploadFileKey, dirName))
.withContentType(fileType.getMimeType())
.withMethod(HttpMethod.PUT)
.withExpiration(expiration);
// 별도로 ACL 파라미터도 추가
generatePresignedUrlRequest.addRequestParameter(Headers.S3_CANNED_ACL, CannedAccessControlList.PublicRead.toString());
return generatePresignedUrlRequest;
}
/**
* Presigned URL의 유효 기간 설정: 2분
*/
private Date getExpiration() {
Date expiration = new Date();
long expTimeMillis = Instant.now().toEpochMilli();
expTimeMillis += 1000 * 60 * 2;
expiration.setTime(expTimeMillis);
return expiration;
}