버전 관리를 위해 빌드된 날짜 삽입하기

SemVer 형식을 이용해 버저닝을 하더라도, 실제로 배포되기 전까지 동일한 버전하에 여러번 빌드할 일이 생기곤 합니다.

이번 릴리즈(배포) 버전은 1.0.1이라고 치면, 실제로 배포되기 전에는 계속 동일한 버전으로 개발->QA가 이뤄지게 됩니다. 특히나 QA로 넘어가게 되면 오류 수정 등이 생길 경우 현재 서버에 올라가있는 빌드가 수정된 버전인지 수정하기 전인지 종종 헷갈리곤 합니다.

이런 혼돈을 방지하기 위해 저희는 SemVer와 함께 빌드된 날짜도 같이 버전에 넣습니다. 예를 들면 1.0.1-2023.11.07 이런식이지요. 그런데 제가 입사하기 전부터 계속 저희는 이 버저닝을 수작업으로 하고 있었습니다. version 텍스트 파일을 프로젝트 폴더에 같이 넣어놓고 개발자가 직접 빌드할 때마다 내용을 수정하는 아주 고전적이고 실수하기 쉬운 방법이었습니다.

저는 빌드 명령어를 쳤을 때, 자동으로 당일 날짜가 들어가 박히면 좋겠다는 생각을 했습니다. 그래서 그런 방법이 없는지 찾아보게 되었습니다.

첫 시도… (실패)

처음에는 바보 같이 소스 코드 어딘가에 Date.now()를 적어 놓으면 될 것이라 생각했습니다. 그러나, 당연하게도 이 값은 사용자가 우리 자바스크립트를 실행할 때마다 갱신되기에 빌드 날짜가 아닌 그냥 오늘 날짜가 계속 나오기 마련이었죠. 저는 빌드할 당시에만 한번 실행되는 코드를 작성해야 하는 것이었습니다. 하지만 자바스크립트는 컴파일하지 않는 언어이기 때문에 언어 자체에서 그런 방법을 지원하고 있지는 않은 것 같습니다. 대신 프론트엔드에서는 소위 “빌드”과정이 있고, 더 정확히 말하자면 “번들링”하는 과정이 있기 때문에 바로 그 “번들러” API 중에서 제가 찾는 기능이 있을 것 같다는 생각을 하게 되었습니다.

해결: Vite define

현재 프로젝트에서는 번들러로 Vite를 사용중입니다. Vite의 옵션중에는 define이라고 하는 전역 상수를 정의할 수 있는 옵션이 있습니다.

https://ko.vitejs.dev/config/shared-options.html#define

문서에 따르면, 정의된 내용들은 개발 중에는 전역으로 정의되나, 빌드 중에는 정적으로 대체됩니다. 따라서 여기에 new Date()를 설정해도 빌드할 때 한번만 계산되어 정적으로 고정되게 됩니다.

이렇게 오늘은 실수하기 쉬운 수작업을 자동으로 대체할 수 있는 방법을 찾아서 적용해보았습니다. 사용하고 있는 번들러에 이렇게 다양한 기능들이 있다는 것을 알게 되었습니다. 그 밖에도 기타 다른 유용한 옵션들이 있을 수 있으니 사용하는 도구에 대해 한번 쯤은 문서를 쭉 읽어보는 것이 좋겠습니다.


Written by@장호현
하루 하루 문제를 해결하고 배운 것을 기록하였습니다.

GitHub