원래 오늘 포스팅은 '과연 무슨 프로그래밍 언어로 공부를 하면 좋은가'에 대한 이야기를 해보려고 했는데,
오후 11시가 되도록 한 줄도 못 쓴 상태에서는 뭔가 좋은 글이 나올 리가 없겠죠.
그래서, 이 시간이 되도록 글을 쓰지 못하게 한 원인에 대한 이야기를 해 보려고 합니다.
정확히는 낮에 회사에서 한 삽질 이야기죠.
상황
오늘 회사에서 제가 담당하던 안드로이드 앱을 배포할 일이 생겼습니다.
중요한 수정 사항은 따로 있었지만, 그 동안 제가 몇 가지 코드 리팩토링을 좀 해 놓은 것들도 있었죠.
특히 안드로이드는 앱을 패키징하는 데 '그래들(gradle)'이라고 부르는 녀석을 사용하고, (자바 계열에서 많이 씁니다)
이것과 연동하기 위해 안드로이드 그래들 플러그인(Android Gradle Plug-in, AGP)이라고 부르는 녀석을 사용하는데요.
저 그래들이 업데이트 될 때마다 AGP도 업데이트가 잦은 편입니다.
꼭 업데이트를 그때그때 해야 하는 건 아니지만, 안드로이드 스튜디오에서 "업데이트 하는 게 좋을 걸~"하고 경고를 자주 하고,
저는 그런 걸 용납하지 못하는 사람이라 (ㅎㅎ) 가급적 최신으로 업데이트를 해 주는 편이죠.
이번에는 AGP 업데이트를 해 주면서 각종 라이브러리들도 최신으로 업데이트를 해 줬는데요.
개발하면서 디버깅하고 하는 데는 큰 문제가 없어서 그러려니 하고 넘어가고 있었습니다.
그러다가, 오늘 배포 때문에 앱을 릴리즈 빌드를 하는 데 갑자기 에러가 발생했던거죠.
안드로이드 릴리즈 빌드를 할 때는, 앱의 크기를 작게 하기 위해 코드와 리소스를 최소화하는(minify) 과정을 거칩니다.
그런데, 이 페이즈에서 에러가 뜨는 거였습니다.
바로 com.google.firebase:firebase-iid 가 포함되어 있지 않다고요.
이상해서 확인해 보니, 저희 앱에서는 firebase 관련 라이브러리의 버전 관리를 위해 일괄적으로
com.google.firebase:firebase-bom 이라는 패키지의 버전으로 묶은 다음, 여기서 각 패키지를 선언해서 쓰고 있었는데,
최신의 패키지에서 com.google.firebase:firebase-iid 가 빠져 있었던 겁니다.
사실 오래 된 문제였는데 잊고 있었습니다.
저게 빠지는 바람에 버전 업을 하지 않고 구 버전을 계속 쓰다가(!), 신규 개발을 의뢰하면서 잊고 있었는데,
신규 버전에서도 동일하게 계속 유지되면서 이번에는 버전 업을 해야지 하고 그대로 올렸는데 다시 오류가 발생했던거죠.
참고로 디버그 상태에서는 발생하지 않고 minify R8 페이즈에서만 발생하는 것이었습니다.
이번 업데이트에선 마침 또 firebase의 message 관련 기능들을 신규 변경한 것이 많아서 구 버전으로 돌리기도 곤란한 차에,
이걸 도대체 어떻게 해결해야하지... 하고 한참을 무식하게(!) 고민했었습니다. 버전만 오락가락 하면서요.
참고로 원래 구 버전의 구성은 다음과 같았습니다.
platform('com.google.firebase:firebase-bom:30.5.0')
implementation 'com.google.firebase:firebase-analytics'
implementation 'com.google.firebase:firebase-messaging'
implementation 'com.google.firebase:firebase-iid'
해결
그러다가, 문득 깨달았습니다.
com.google.firebase:firebase-bom 이라는 녀석은 결국, 개별 패키지의 버전 관리 이외엔 큰 의미가 없는 녀석이라는 사실을요.
저기에 com.google.firebase:firebase-iid 가 포함되어 있지 않으면, 굳이 버전이 따라다닐 필요가 없지 않나...?
platform('com.google.firebase:firebase-bom:33.6.0')
implementation 'com.google.firebase:firebase-analytics'
implementation 'com.google.firebase:firebase-messaging'
implementation 'com.google.firebase:firebase-iid:21.1.0'
네, 결국 깔끔하게 빌드가 잘 되고 무사히 배포를 마쳤습니다.
결론
가장 큰 잘못은 역시 문제가 생겼을 때 미루면 안 된다는 것이었습니다.
그리고, 이건 개발을 하면서 가장 많이들 하는 잘못인데,
안정화를 위한답시고 무조건 옛날 버전으로 되돌리거나 고집하려고 하는 것입니다.
물론, 항상 가장 최신 버전을 쫓아가는 것이 좋은 것은 아닙니다.
완전히 안정화되기 전의 기능을 상용화된 앱에 잘 못 사용하다가 오류가 발생하면 손해가 발생하는 것은 우리이니 말이죠.
하지만, 그렇다고 해서 그것이 우수한 기능을 도입하는 데 게으르려는 핑게로 작용해도 안 되고,
둘 중 선택해야 한다면 저는 최신 기술을 먼저 도입하고, 배포하기 전 충분히 테스트해보고 문제점을 파악하면 된다고 생각합니다.
마지막으로 오늘의 제목이자 제 개인적인 교훈으로, 이전의 잘 되었던 코드나 설정을 너무 맹신하면 안 된다는 것입니다.
무언가 잘 못 되었을 경우는 일단 무조건 의심하고 처음부터 다시 분석해야지,
이게 왜 안 되지? 하고 고민하기 시작하면 돌아오는 건 멘붕밖에 없는 것 같습니다.
이상, 프로그램 개발 경력자라고 주장하는 사람의 삽질기였습니다.