Active Storage의 다이렉트 업로드 기능은 클라이언트가 API 서버를 거치지 않고 클라우드 스토리지에 파일을 직접 업로드하는 방식을 의미합니다. 이는 서버 부하를 줄이고 업로드 속도를 향상시키는 이점을 제공합니다. Active Storage는 이러한 다이렉트 업로드를 위한 서버 측 API와 프런트엔드 JavaScript 클라이언트를 기본으로 제공하지만, 이는 RESTful API에 기반하고 있어 GraphQL과의 통합 시 추가적인 작업이 필요합니다.
GraphQL 뮤테이션 구현
Rails의 DirectUploadsController
소스 코드를 분석하여, 파일 메타데이터(파일명, 크기, 체크섬, 콘텐츠 타입)를 인자로 받아 업로드 URL과 헤더, 그리고 signed_blob_id
를 반환하는 createDirectUpload
GraphQL 뮤테이션을 구현합니다. 이 과정에서 파일 내용 무결성 검증에 사용되는 MD5 체크섬(base64 인코딩)의 중요성을 강조합니다.
ruby
class CreateDirectUpload < GraphQL::Schema::Mutation
# ... input arguments and output fields ...
def resolve(input:)
blob = ActiveStorage::Blob.create_before_direct_upload!(input.to_h)
{ direct_upload: { url: blob.service_url_for_direct_upload,
headers: blob.service_headers_for_direct_upload.to_json,
blob_id: blob.id,
signed_blob_id: blob.signed_id } }
end
end
클라이언트 측 JavaScript 통합
클라이언트 측에서는 @rails/activestorage
라이브러리의 FileChecksum
과 BlobUpload
클래스를 활용하여 파일 업로드 과정을 구현합니다. 주요 단계는 다음과 같습니다.
- 파일 메타데이터 획득:
getFileMetadata
함수를 통해 파일의 이름, 크기, 타입 및 체크섬을 계산합니다. - 업로드 자격 증명 요청:
createDirectUpload
GraphQL 뮤테이션을 호출하여 다이렉트 업로드에 필요한 URL과 헤더,signedBlobId
를 받습니다. - 파일 직접 업로드:
directUpload
함수를 사용하여 획득한 URL과 헤더를 바탕으로 파일을 클라우드 스토리지에 직접 HTTP PUT 요청으로 업로드합니다.
이러한 과정을 통해 Rails의 내장 기능을 최대한 재활용하면서 GraphQL 환경에 맞는 효율적인 다이렉트 파일 업로드 시스템을 구축할 수 있습니다.