날짜 라이브러리 리팩터링 (Antd V5 migration)
3 min read날짜 라이브러리 리팩터링
리팩터링의 냄새
어드민 프로젝트에서 여러 날짜 라이브러리가 혼용해서 사용되고 있는 상황이었다.
주로 moment
와 dayjs
가 쓰이고 있었고 심지어는 현재 설치되어 있지도 않은 date-fns
라이브러리의 잔재가 남아있기도 했다.
이렇게 날짜 라이브러리에서 여러 라이브러리 코드가 섞이다보니 다음과 같은 문제점이 발생했다.
- 불필요한 번들 사이즈 포함
- 코드 이해 및 사용 단계에서 불필요한 비용 초래
하나의 날짜 라이브러리로 통일시킬 필요성을 느꼈다.
빠르고 효율적으로 리팩터링을 해보자.
왜 이런 일이 발생했을까?
우선 현재 상황을 분석하는 것이 중요하다.
사용되지 않는 date-fns
관련 코드는 삭제하면 해결된다.
문제는 moment
와 dayjs
를 하나로 통일시키는 것이다.
그렇다면 왜 moment
와 dayjs
가 같이 쓰이게 된 것일까?
Ant Design V4
원인은 Ant Design
때문이었다.
현재 프로젝트에서는 UI 라이브러리로 Ant Design
를 사용하고 있다.
여기서 사용되는 버전이 V4였다.
Antd
V4에서는 라이브러리 내부적으로 moment
를 사용한다.
그래서 moment
가 필수적으로 사용되는 상황이었다.
따라서 현재 상황에서 가장 보수적인 방법으로 접근하면 moment
를 계속 사용하는 것이다.
하지만 moment
를 계속 사용하고 dayjs
를 없애는 것이 과연 정답일까?
dayjs, moment
두 라이브러리의 비교는 꽤 오래 전부터 이루어져 왔고 관련된 정보들도 쉽게 파악할 수 있다.
아무래도 가장 크게는 번 들 크기와 유지보수 측면을 들 수 있을 것이다.
Bundle Size
Bundlephobia에서 두 라이브러리의 번들 크기를 확인해보자.
moment 크기
약 73KB가 사용된다.
dayjs 크기
3KB가 사용된다. 눈에 띄게 차이가 난다.
또한 크롬 개발자 도구에서는 단순히 크기만으로도 moment를 교체할 것을 권장하고 있다.
Maintenance
moment
에서는 다음 문구를 확인할 수 있다.
We now generally consider Moment to be a legacy project in maintenance mode. It is not dead, but it is indeed done.
이와 비교해서 dayjs
에서는 다음과 같이 소개한다.
Fast 2kB alternative to Moment.js with the same modern API
If you use Moment.js, you already know how to use Day.js.
여러 부분에서 moment
사용을 지양하는 신호들을 접할 수 있다.
그렇다면 Antd
에서는 이 문제를 어떻게 다루고 있을까?