이전 ActiveStorage::Blob
open의 한계
기존에는 `ActiveStorage::Blob
open` 메서드가 블록 형태로만 사용 가능했습니다. 블록이 종료되면 임시 파일은 즉시 삭제되었기 때문에 다음과 같은 복잡한 시나리오에서 문제가 발생했습니다.
-
백그라운드 작업 연동의 어려움: 블록 내에서
DataImportWorker.perform_later(file.path)와 같이 백그라운드 작업을 스케줄링할 경우, 작업 실행 시점에는 이미 임시 파일이 삭제되어 존재하지 않는 문제가 있었습니다. -
메모리 효율성 저하: 대안으로
blob.download를 사용하면 전체 파일을 메모리에 로드해야 했고, 이는 대용량 파일 처리 시 메모리 사용량 급증과 비효율성을 초래했습니다. -
외부 파일 경로 사용 제약: FFmpeg, ImageMagick 등 영구적인 파일 경로를 요구하는 외부 도구와의 직접적인 연동이 어려웠습니다.
Rails 8.1 이후의 개선된 동작
Rails 8.1부터는 file = blob.open과 같이 블록 없이 `ActiveStorage::Blob
open을 호출할 수 있게 되었습니다. 이 경우 반환된 임시 파일은 개발자가 명시적으로 file.close 또는 file.unlink`를 호출하기 전까지 유지됩니다. 이 변화는 개발자에게 파일 생명주기에 대한 완전한 제어권을 부여하며, 다양한 고급 사용 사례를 가능하게 합니다.
새로운 동작으로 가능해진 주요 사용 사례
-
대용량 파일 스트리밍: Shopify의
maintenance_tasksgem과 같은 애플리케이션에서 대용량 CSV 파일을 중간에 손실될 염려 없이 행별로 스트리밍 처리할 수 있습니다. -
다단계 작업 파이프라인: 파일 다운로드, 유효성 검사, 변환, 데이터 저장 등 여러 단계에 걸쳐 동일한 임시 파일을 지속적으로 활용할 수 있습니다.
-
외부 도구 통합: FFmpeg, ImageMagick, ClamAV와 같이 영구적인 파일 경로를 필요로 하는 외부 도구에 임시 파일 경로를 직접 전달하여 원활하게 통합할 수 있습니다.
-
다중 통과 처리: 유효성 검사, 통계 생성, 최종 데이터 가져오기 등 파일에 대한 여러 번의 스캔이 필요할 때 반복적인 다운로드 없이 효율적으로 처리할 수 있습니다.
-
분산 처리: 임시 파일을 청크로 분할하고 병렬로 처리하여 대규모 분산 워크플로우를 효과적으로 구현할 수 있습니다.
블록 API 사용 권장 시점
단기적이거나 작은 규모의 작업(예: 이미지 크기 조정, PDF 유효성 검사, 컨트롤러 액션 내 소규모 CSV 파일 처리)에서는 자동 정리 기능이 있는 기존의 블록 버전 API가 여전히 유용하며 권장됩니다.