Rails Active Storage Direct Upload와 GraphQL 연동 가이드

Using Active Storage Direct Uploads in GraphQL with Ruby on Rails

작성자
발행일
2025년 03월 03일

핵심 요약

  • 1 본 문서는 GraphQL 환경에서 파일 업로드 처리의 어려움을 해결하기 위해 Rails의 Active Storage Direct Upload 기능을 활용하는 방법을 다룹니다.
  • 2 Active Storage Direct Upload는 파일을 클라이언트에서 클라우드 스토리지로 직접 전송하여 서버 부하를 줄이고 성능을 향상시킵니다.
  • 3 React.js, Ant Design, Ruby GraphQL을 사용하여 프론트엔드와 백엔드 간의 직접 업로드 연동 과정을 상세히 설명합니다.

도입

GraphQL은 재사용성이 뛰어나 React.js 및 React Native 애플리케이션과 자주 함께 사용되지만, 파일 업로드 기능을 기본적으로 제공하지 않아 개발 시 어려움이 따릅니다. Apollo Upload Server와 같은 대안이 존재하지만, 본 문서에서는 Rails의 공식 솔루션인 Active Storage의 직접 업로드(Direct Upload) 기능을 활용하여 이 문제를 해결하는 방안을 제시합니다. 직접 업로드는 일반적인 파일 업로드 방식과 달리 파일이 브라우저에서 Rails 서버를 거치지 않고 S3, Azure, Google Cloud Storage와 같은 클라우드 저장소 또는 로컬 디스크로 직접 전송되는 방식입니다. 이는 성능을 크게 향상시키고 서버의 부하를 줄이는 이점을 제공합니다. 이 가이드는 React.js, Ant Design, Ruby GraphQL 및 Rails 로컬 디스크로의 직접 업로드 연동 과정을 중심으로 설명합니다.

Active Storage Direct Upload를 GraphQL과 연동하는 과정은 크게 세 단계로 구성됩니다. 첫째, 폼 컴포넌트(React.js, Ant Design)와 직접 업로드 기능을 통합합니다. Rails는 /rails/active_storage/direct_uploads라는 직접 업로드용 내장 엔드포인트를 제공하며, @rails/activestorage 라이브러리의 DirectUpload 클래스를 사용하여 파일을 직접 업로드하는 헬퍼 함수(directUploadCreate)를 정의합니다. 이 함수는 파일 업로드 완료 후 signed_id 문자열을 반환하는데, 이 signed_id는 업로드된 파일의 임시 식별자 역할을 합니다. signed_id는 단순한 문자열이므로, GraphQL 뮤테이션에서 파일 타입 대신 문자열 필드로 처리하여 ApolloUploadServer와 같은 복잡한 파일 타입 처리를 피할 수 있습니다. Ant Design의 Upload 컴포넌트의 customRequest 속성을 활용하여 이 헬퍼 함수를 호출하고, 반환된 signed_id를 폼 필드(예: avatar)에 설정합니다.

둘째, GraphQL 뮤테이션을 업데이트합니다. 프론트엔드에서 signed_id를 문자열로 전달하므로, Rails 애플리케이션의 GraphQL 스키마(예: Types::UserAttributes)에서 해당 필드(예: avatar)를 String 타입으로 정의해야 합니다. 이어서 사용자 업데이트와 같은 기능을 처리하는 GraphQL 뮤테이션(예: Mutations::UserUpdate)을 생성하고, 입력된 signed_id를 사용하여 Active Storage가 실제 파일과 연동되도록 Rails 모델에서 처리합니다. 마지막으로, 이 뮤테이션을 GraphQL 스키마의 MutationType에 추가하여 클라이언트에서 접근할 수 있도록 합니다.

셋째, 클라이언트에서 뮤테이션을 호출합니다. React 애플리케이션에서는 graffle와 같은 GraphQL 클라이언트를 사용하여 폼 제출 시 정의된 GraphQL 뮤테이션(userUpdateDocument)을 호출합니다. 이때, 폼에서 설정된 signed_id를 뮤테이션의 attributes 객체에 포함하여 전송합니다. 이 과정을 통해 파일은 클라이언트에서 클라우드 저장소로 직접 업로드되고, 그 결과로 생성된 signed_id는 GraphQL을 통해 Rails 백엔드로 전달되어 해당 파일이 데이터베이스의 레코드와 올바르게 연결됩니다.

결론

결론적으로, Rails Active Storage의 직접 업로드 기능과 GraphQL을 효과적으로 연동함으로써, GraphQL의 파일 업로드 한계를 극복하고 웹 애플리케이션의 성능을 크게 향상시킬 수 있습니다. 파일이 서버를 거치지 않고 직접 클라우드 저장소로 전송되므로, 서버의 부하를 줄이고 사용자 경험을 개선하는 데 기여합니다. `signed_id`를 활용한 접근 방식은 GraphQL 뮤테이션의 복잡성을 줄여 개발 과정을 간소화하며, React.js와 같은 최신 프론트엔드 프레임워크와의 통합 또한 용이하게 만듭니다. 이 가이드를 통해 개발자들은 Rails 및 GraphQL 기반 애플리케이션에서 효율적인 파일 업로드 솔루션을 구현할 수 있을 것입니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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