Rails 8의 발전과 배포 전략
- 개발 경험 간소화: Rails 8은 애플리케이션 구축 및 배포 과정을 크게 개선하여 초기 설정 시간을 단축했습니다.
- 데이터베이스 선택: SQLite의 백업 및 재해 복구(DR) 문제로 인해 PostgreSQL과 AWS RDS를 선호하며, AWS RDS는 편리한 업그레이드 및 Redis 클러스터링 관리가 용이하다는 장점이 있습니다.
- Kamal을 통한 배포: Capistrano의 대안으로 Kamal(구 Kamal 2)을 활용하여 Docker 기반의 서버 초기화, 데이터베이스 설정, 애플리케이션 배포를 자동화합니다.
kamal console,kamal logs,kamal deploy와 같은 명령어를 통해 프로덕션 환경 관리가 편리해졌습니다. - Kamal 설정의 도전:
architecture오타로 인해 4시간 동안 디버깅했으며, AI 도구가 구버전 Kamal 1의 정보를 제공하여 해결에 어려움을 겪었습니다. ARM 아키텍처(Graviton)를 사용하여 비용을 절감했습니다.
AI 개발 도구 활용 및 한계
- AI의 유용성: Cursor 및 Warp와 같은 AI 도구를 사용하여 코드 생성, 마이그레이션 명령, Rails 앱 초기화 등 개발 생산성을 높였습니다. RSpec 테스트 코드 생성에도 활용했습니다.
- AI의 한계: AI는 최신 Rails 8의 변경 사항이나 특정 프론트엔드 스택(예: React 대신 Tailwind 사용)의 컨텍스트를 이해하지 못하고 구버전 또는 부적절한 코드를 제공하는 경우가 있었습니다. 특히 Action Text와 Hotwire 관련 변경 사항에서 이러한 문제가 두드러졌습니다.
Action Text와 파일 처리의 복잡성
- Action Text 도입: Rails 6부터 내장된 위지윅(WYSIWYG) 에디터인 Action Text는 기본적인 기능을 제공하며, Rails 8.1부터 마크다운 지원이 예정되어 있습니다.
- S3 파일 업로드 문제: S3에 파일 저장 시 안정성을 위해 버전 관리를 활용하지만, Active Storage의 백그라운드 후처리 지연으로 인해 이미지 로딩 시
404/403오류가 발생했습니다. - 임시 해결책: JavaScript를 사용하여 이미지 로딩 상태를 지속적으로 확인하는 코드를 작성했습니다. Cloudflare를 통해 S3 버킷의 공개 URL을 프록시하는 과정에서 HTML 파일 업로드 보안 취약점이 발견되어 추가 정책 설정이 필요했습니다.
실시간 기능 및 프론트엔드
- Solid Cable과 인증 문제: Solid Cable은 실시간 업데이트 기능을 제공하지만,
current_user와 같은 인증 관련 코드를 포함한 스니펫을 “모두에게” 브로드캐스트할 때 Warden 오류가 발생했습니다. 이는 익명 사용자에게 인증 정보가 없기 때문입니다. - 해결책: 해키한 CSS 클래스 기반의 권한 처리 방식을 사용했습니다.
- Propshaft와 Hotwire: Sprockets를 대체하는 Propshaft는 애셋 파이프라인을 간소화하며, npm 및 React 없이 Tailwind CSS와 Hotwire를 활용하여 Rails의 기본 방식을 따랐습니다. 그러나 Hotwire의
turbo delete와 같은 변경 사항에 대해 AI가 구버전 코드를 제시하는 문제가 있었습니다.
인증 및 기타 도구
- Rails 8 내장 인증 vs. Devise: Rails 8의 내장 인증 기능은 간단한 앱에 적합하지만, 이메일 확인, 비밀번호 재설정, SSO, 2FA 등 고급 기능이 부족하여 Devise를 계속 사용했습니다.
- Thruster: Kamal이 자동으로 설정하는 Engine X 유사한 리버스 프록시로, SSL 종료 등 기본적인 기능을 제공하여 편리함을 느꼈습니다.
- Solid Cache vs. Redis: Solid Cache는 보조 DB를 캐싱에 사용하지만, Solid Cable과의 연동 문제 및 Redis의 유연성 때문에 AWS ElastiCache(Redis)를 선호했습니다. Sidekiq도 Active Job 대신 계속 사용합니다.
- 개발 워크플로우: RuboCop 및 GitHub Actions가 Rails 8에 기본 포함되어 있었으며, Terraform과 Ansible로 서버 인프라를 관리합니다. Pundit을 사용하여 권한 관리를 효율적으로 수행합니다.