Active Storage와 GraphQL을 활용한 다이렉트 업로드 통합

Active Storage meets GraphQL: Direct Uploads—Martian Chronicles, Evil Martians’ team blog

작성자
jeff
발행일
2019년 04월 02일

핵심 요약

  • 1 Active Storage의 다이렉트 업로드 기능을 GraphQL API와 통합하여 파일 업로드 워크플로우를 효율적으로 구현하는 방법을 설명합니다.
  • 2 Rails의 DirectUploadsController 로직을 GraphQL 뮤테이션으로 변환하고, Active Storage의 JavaScript 라이브러리를 재활용하여 클라이언트 측 구현을 간소화합니다.
  • 3 파일 메타데이터(체크섬 포함) 획득, 업로드 자격 증명 요청, 그리고 클라우드 스토리지로의 직접 업로드 과정을 상세한 코드 예시와 함께 제시합니다.

도입

본 문서는 필자가 Rails 6 프로젝트에서 Active Storage를 도입하며 겪은 경험을 바탕으로, 기존의 복잡한 파일 업로드 방식을 개선하고자 한 여정을 다룹니다. 특히, Active Storage가 기본으로 제공하는 다이렉트 업로드 기능을 GraphQL API와 효과적으로 통합하는 데 중점을 둡니다. 과거 Rails 4 환경에서 GraphQL을 통한 파일 업로드 시 발생했던 다양한 문제점(버그, 비엄격한 타입, Apollo 의존성)을 해결하고, REST 기반의 Active Storage 다이렉트 업로드를 GraphQL 생태계에 자연스럽게 녹여내는 방안을 모색합니다.

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 라이브러리의 FileChecksumBlobUpload 클래스를 활용하여 파일 업로드 과정을 구현합니다. 주요 단계는 다음과 같습니다.

  1. 파일 메타데이터 획득: getFileMetadata 함수를 통해 파일의 이름, 크기, 타입 및 체크섬을 계산합니다.
  2. 업로드 자격 증명 요청: createDirectUpload GraphQL 뮤테이션을 호출하여 다이렉트 업로드에 필요한 URL과 헤더, signedBlobId를 받습니다.
  3. 파일 직접 업로드: directUpload 함수를 사용하여 획득한 URL과 헤더를 바탕으로 파일을 클라우드 스토리지에 직접 HTTP PUT 요청으로 업로드합니다.

이러한 과정을 통해 Rails의 내장 기능을 최대한 재활용하면서 GraphQL 환경에 맞는 효율적인 다이렉트 파일 업로드 시스템을 구축할 수 있습니다.

결론

결론적으로, Active Storage의 강력한 다이렉트 업로드 기능을 GraphQL API와 성공적으로 통합하여 파일 업로드 프로세스를 간소화하고 효율성을 극대화할 수 있었습니다. 특히, Rails의 서버 측 로직을 GraphQL 뮤테이션으로 변환하고, Active Storage가 제공하는 클라이언트 측 JavaScript 유틸리티를 재활용함으로써 개발 복잡도를 낮추고 견고한 솔루션을 구축할 수 있었습니다. 최종적으로 `signedBlobId`를 활용하여 업로드된 파일을 애플리케이션 내의 특정 모델에 손쉽게 연결하는 방법을 제시하며, 이는 Rails와 GraphQL을 함께 사용하는 프로젝트에 실질적인 도움이 될 것입니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!