일부 Rails 앱은 bundle update rails 명령어 한 줄이면 손쉽게 업그레이드할 수 있습니다.
하지만 다른 종류의 앱을 가지고 있다면 어떨까요? 미래로 끌고 가기 귀찮아서 아직도 Rails 4.0, 심지어 3.2에 머물러 있는 앱들 말입니다.
빠른 업그레이드든 고통스러운 업그레이드든, 다음 단계를 따르면 앱을 최대한 매끄럽게 Rails 4.2로 옮길 수 있습니다. 그 과정에서 Rails 4.2의 새로운 기능을 제대로 활용하는 방법도 함께 배우게 될 것입니다.
업그레이드 가이드부터 읽으세요
Rails 업그레이드는 항상 공식 Rails 업그레이드 가이드(Rails Upgrade Guide)를 읽는 것부터 시작해야 합니다.
업그레이드 가이드는 Rails 버전 간 주요 변경 사항 대부분을 안내해 줍니다. 앱에서 마주치게 될 가장 큰 문제들을 해결하기 위해 정확히 무엇을 바꿔야 하는지 알려줍니다. (예를 들어, Rails 4.1의 특정 변경 사항을 미리 알지 못했다면 몇 시간씩 고생했을 겁니다.)
그뿐만 아니라 업그레이드 가이드는 해당 변경 사항을 왜 적용해야 하는지도 설명해 줍니다. 이 점이 중요합니다. 어떤 제안을 따라야 하고 어떤 것은 무시해도 되는지 스스로 판단할 수 있게 해주기 때문입니다.
Rails 4.2의 변경 사항을 더 깊이 이해하고 싶다면 릴리스 노트(release notes)도 읽어보세요. 곧 사용할 수 있게 될 Rails 4.2의 멋진 새 기능들을 소개해 줍니다. 무엇보다 업그레이드를 꼭 끝내야겠다는 동기를 부여받게 될 겁니다.
단계별로 업그레이드하세요
새로운 Rails 버전으로 이동할 때는 항상 최신 포인트 버전(point version)으로 먼저 업그레이드하세요. 그리고 마이너 버전을 건너뛰지 마세요.
예를 들어 4.1.6에서 4.2로 올라가고 싶다면, 4.1.6 → 4.1.9 → 4.2 순서로 진행합니다. 4.0.12에서 시작한다면 4.0.12 → 4.0.13 → 4.1.9 → 4.2 순서로 진행하면 됩니다. 일이 훨씬 많아 보이지만, 장기적으로는 오히려 시간을 절약해 줍니다.
왜 그럴까요?
Rails 릴리스의 최신 포인트 버전에는 가장 정확한 지원 중단(deprecation) 경고가 담겨 있기 때문입니다.
지원 중단 경고가 얼마나 유용한지 과소평가하지 마세요. 단계별로 업그레이드하면 경고가 무엇이 깨질지, 그리고 이를 어떻게 예방할 수 있는지 정확히 알려줍니다. 너무 큰 폭으로 건너뛰면 앱이 그냥 깨져버리고, 원인조차 파악할 수 없습니다.
마지막으로, 포인트 버전 업그레이드(예: 4.0.9 → 4.0.13)에서 테스트가 실패한다면, 메이저나 마이너 업그레이드에서도 대개 똑같이 실패합니다. 하지만 변경된 내용이 적을수록 문제를 디버깅하고 수정하기가 훨씬 쉽습니다.
따라서 이렇게 진행하세요:
- 현재 앱이 사용 중인 Rails 버전의 최신 포인트 릴리스로 업그레이드합니다.
bundle update를 방해하는 다른 gem들을 업그레이드합니다.- 테스트를 수정하고, 필요에 따라 커밋합니다.
- 지원 중단 경고를 수정하고, 필요에 따라 커밋합니다.
- Rails의 다음 마이너 또는 메이저 버전으로 업그레이드하고, 위 과정을 반복합니다.
테스트에 의지하세요
Rails를 업그레이드할 때 테스트는 무언가 잘못되었다는 첫 번째 신호가 됩니다. 테스트를 가장 먼저 실행하고, 가장 먼저 수정해야 합니다. 테스트가 대체로 통과하기 전에는 Rails 앱이 부팅되도록 만들려고 애쓰지도 마세요.
Gem을 업그레이드하세요
테스트가 실패했는데 내 잘못 같지 않다면, 대개 gem 중 하나를 업데이트해야 한다는 뜻입니다.
Rails 업그레이드만큼 gem 업그레이드에 좋지 않은 타이밍은 없습니다. 앱의 많은 부분이 동시에 바뀌기 때문에, Rails 업그레이드 때문에 문제가 생겼는지, gem 업그레이드 때문인지, 아니면 내가 만든 문제인지 구분하기 어렵습니다.
하지만 일부 gem은 Rails 내부에 깊이 의존하기 때문에 어쩔 수 없이 업데이트해야 할 때가 있습니다. sass 내부에서 오류가 발생하면 sass-rails gem을 업그레이드하세요. 그리고 상황이 더 나빠지지 않기를 바랄 뿐입니다.
메모를 아주 많이 남기세요
특히 험난한 Rails 업그레이드를 진행 중이라면 시행착오를 거치게 됩니다. 디버깅을 하고, 코드를 조정하고, 테스트를 수정하게 될 겁니다.
이 과정에서 당신은 반드시 자신이 변경한 내용을 잊어버립니다. 거의 다 됐는데 조금 모자랐던 시도들. 다음에 살펴보려던 테스트들. 코드를 변경해야 할 다른 위치들. Rails 4.2로 자신의 앱을 업그레이드 중인 동료들과 공유할 팁들.
그러니 메모를 많이 남기세요. 모든 것을 기록하세요. 시도한 것들과 변경한 파일들. 실패 원인에 대한 가설과 그것이 맞았는지 여부. 업데이트해야 했던 gem들. 이상해 보이는 동작과 나중에 더 자세히 확인하고 싶은 부분들.
변경을 했다가 롤백했다가, 나중에 그게 실제로 옳은 선택이었음을 깨닫고도 무엇을 했는지 기억하지 못하는 상황은 피하고 싶을 겁니다. 그러니 반드시 기록해 두세요.
추가 리소스 몇 가지
댓글에서 Miha Rekar는 RailsDiff를 소개했습니다. RailsDiff는 서로 다른 Rails 버전으로 생성된 새 Rails 앱 간의 차이를 보여주는 도구입니다. 더 이상 필요 없는 설정 매개변수나 앱에 추가해야 할 새로운 설정을 파악하는 데 탁월한 방법입니다.
또한 Daniel Kehoe는 RVM과 RVM gemset을 활용해 Ruby와 Rails를 업데이트하는 포괄적인 가이드를 작성했습니다.
최선의 Rails 업그레이드 경험을 위해
어떤 Rails 업그레이드는 아주 매끄럽습니다. 그냥 잘 작동하죠. 반면 어떤 업그레이드는 며칠, 심지어 몇 주에 걸친 도전적인 프로젝트가 되기도 합니다. 앱의 특성, 의존성, Rails가 변경한 구체적인 사항에 따라 달라지는 것입니다. 하지만 위의 단계들을 따르면 최선의 업그레이드 경험을 할 수 있습니다.
이미 Rails 4.2로 넘어오셨나요? 업그레이드는 잘 마치셨나요? gem 몇 개만 업데이트하면 끝이었나요, 아니면 아직도 마지막 하나의 실패하는 테스트를 쫓고 계신가요?
(간단한 안내: 2월 11일에 Practicing Rails를 출시합니다! 얼리 액세스 25% 할인을 받을 수 있는 기간이 이제 몇 주 남지 않았습니다.)