이번 마이그레이션은 크게 세 가지 핵심 영역에서 진행되었습니다.
1. 데이터베이스 마이그레이션
- 과제: 기존 PostgreSQL 9.6은 공식 지원이 종료되어 최신 버전인 17.5로의 업그레이드가 필수적이었습니다. 버전 간의 큰 차이로 인해 데이터 손상 위험이 존재했습니다.
- 해결:
pg_dumpall
대신 단일 데이터베이스를 대상으로 하는pg_dump
를 사용하여 버전 불일치 문제를 피했습니다. 이 과정에서docker exec
명령과 환경 변수를 활용하여 안전하게 데이터를 백업하고 새로운 PostgreSQL 17.5 인스턴스로 가져왔습니다. - 이점: 네이티브 JSON 필드 지원, 증분 백업, 향상된 메모리 관리 및 인덱싱을 통한 성능 향상 등 최신 PostgreSQL의 이점을 활용할 수 있게 되었습니다.
2. 이미지 마이그레이션 (CarrierWave에서 ActiveStorage로)
- 과제: 약 5만 개에 달하는 기존 리스팅 이미지는 CarrierWave와 고정된 S3 경로를 사용하고 있어 유지보수가 어렵고 미래 확장에 적합하지 않았습니다.
- 해결: Rails 8 업그레이드와 함께 ActiveStorage로 전환했습니다. 기존 이미지를 레거시 S3 버킷에서 다운로드한 후 ActiveStorage를 통해 재업로드하는 Ruby 스크립트를 작성하여 처리했습니다. 이 스크립트는 AWS 속도 제한을 피하기 위해 동기적으로 실행되었으며, 약 4시간이 소요되었습니다.
- 이점: ActiveStorage 도입으로 업로더 및 하드코딩된 S3 경로가 사라지고, 이미지가 자동으로 관리되며, 필요에 따라 썸네일이 생성되어 시스템이 더욱 간결하고 유지보수하기 쉬워졌습니다.
3. 보안 자격 증명 관리 현대화
- 과제: 기존 Rails 4.2 환경에서는
secrets.yml
에 평문으로 비밀 정보가 저장되어 Git에 커밋되는 보안 취약점이 있었습니다. - 해결: Rails 5.2에서 도입된 암호화된 자격 증명(encrypted credentials)을 사용하고, 배포 도구 Kamal이 Bitwarden과 같은 비밀번호 관리자로부터 직접 비밀 정보를 가져오도록 설정했습니다.
- 이점: Rails 마스터 키, 데이터베이스 자격 증명 등 모든 환경 변수가 안전하게 관리되며, 수동 복사나 저장소에 평문 비밀 정보가 노출될 위험이 사라졌습니다.
4. 마이그레이션을 통해 얻은 교훈
- 스크립트의 중요성: 반복 가능하고 신뢰할 수 있는 스크립트는 복잡한 마이그레이션 과정에서 정신적 부담을 줄이고 효율성을 높입니다.
- 스테이징 환경에서의 철저한 테스트: 프로덕션 배포 전 스테이징 환경에서 전체 마이그레이션 과정을 실행하여 잠재적 문제를 사전에 발견하고 해결하는 것이 필수적입니다.
- 기술 부채 해소 기회: 마이그레이션은 CarrierWave, Sidekiq 등 오래된 의존성을 ActiveStorage, SolidQueue 등 최신 대안으로 교체하여 아키텍처를 간소화할 좋은 기회입니다.
- 보안의 중요성: Rails 암호화된 자격 증명과 비밀번호 관리자 통합은 현대적인 보안 관행을 확립하는 데 기여합니다.
- 최신 Rails의 가치: Importmaps, Kamal과 같은 Rails 8의 최신 툴링은 배포, 확장 및 유지보수를 현저히 단순화합니다.