RustFS 실습 - 3 미디어 조회

TopOfTheHead·2026년 7월 26일
post-thumbnail

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();

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이 도출

profile
공부기록 블로그

0개의 댓글