
Id를 통해미디어 파일에 해당하는Media Entity를 검색 후RustFS에 요청하여 수신한PresignedURL을 통해미디어 파일을 다운로드
AWS SDK for S3의조회관련클래스
。S3관련 기능을 정의한클래스
▶RustFS는S3 API를 그대로 사용하므로, 호환 가능
GetObjectRequest
。백엔드 서버에서미디어파일을 직접다운로드를 수행하기 위해 요청하는객체
▶ 해당미디어 파일이 저장된Bucket과Key( =경로/파일명.확장자)를 정의GetObjectRequest request = GetObjectRequest.builder() .bucket("my-bucket") .key("images/cat.png") .build();
GetObjectPresignRequest
。미디어파일의다운로드를 위한PresignedURL를 요청하는객체
▶GetObjectRequest와URL 만료시간을 지정하여객체생성GetObjectPresignRequest presignRequest = GetObjectPresignRequest.builder() .signatureDuration(Duration.ofMinutes(10)) .getObjectRequest(GetObjectRequest객체) .build();
PresignedGetObjectRequest
。S3Presigner객체.presignGetObject(GetObjectPresignRequest객체)를 통해 도출한결과 객체
▶ 해당미디어파일을 다운로드할 수 있는PresignedURL을 포함
。URL url = PresignedGetObjectRequest객체.url();을 통해PresignedURL추출
DTO정의
PresignedUrlResponse
。MediaController에 의해다운로드 파일이 정의된Presigned URL과미디어 파일 정보를 반환public record PresignedUrlResponse( String presignedUrl, MediaResponse media ) { }
MediaService
。RustFS로 부터의다운로드 PresignedURL을 생성하여 반환하는메서드
▶Media Entity 객체의id를 전달 시 해당미디어 파일이 저장된Path와Bucket을 통해PresignedURL을 생성public String getPresignedUrl(Long id) { Media foundedMedia = mediaRepository.findByIdAndDeletedAtIsNullOrThrow(id); // Media가 INIT & FAILED 상태 인 경우 비허용 if (foundedMedia.getStatus() == MediaStatus.INIT || foundedMedia.getStatus() == MediaStatus.FAILED ) { throw new IllegalArgumentException("Media is in FAILED or INIT status"); } // 다운로드할 미디어 파일의 요청객체를 생성 GetObjectRequest getObjectRequest = GetObjectRequest.builder() .bucket(rustFsProperties.bucket()) // 다운로드할 파일의 버킷 .key(foundedMedia.getPath()) // 다운로드할 파일의 경로/파일.확장자 .build(); // `GetObjectRequest`와 `URL 만료시간`을 지정하여 다운로드 PresignedURL을 요청하는 `객체` 생성 GetObjectPresignRequest presignRequest = GetObjectPresignRequest.builder() .signatureDuration(Duration.ofSeconds(rustFsProperties.presignedUrlExpirationSeconds())) .getObjectRequest(getObjectRequest) .build(); // GetObjectPresignRequest에 서명을 추가해서 RustFS에 전달함으로써 다운로드 URL을 정의하는 PresignedURL을 생성 PresignedGetObjectRequest presignedRequest = s3Presigner.presignGetObject(presignRequest); return presignedRequest.url().toString(); }
MediaController
。미디어 파일에 해당하는id를PathVariable로 전달 시 해당미디어 파일을 다운로드할 수 있는PresignedURL을 수신@GetMapping("/api/v1/media/{id}/presigned-url") public PresignedUrlResponse getPresignedUrl(@PathVariable Long id) { Media media = mediaRepository.findByIdAndDeletedAtIsNullOrThrow(id); String presignedUrl = mediaService.getPresignedUrl(id); return new PresignedUrlResponse(presignedUrl, MediaResponse.from(media)); }
이후 해당
Controller를 통해미디어 파일을 정의하는Media Entity를 요청하는 경우이미지를다운로드할 수 있는URL이 도출