enum
을 사용하던 와중 우연히 enum
을 사용하면 안된다라는 포스팅을 본 적이 있습니다.
하지만 왜 enum
을 사용하면 안되는지에 대해서는 자세하게 알지 못했습니다.
오늘은 꼭 enum
을 사용하면 안되는 것인가..? 에 대해서 자세하게 알아보려고 합니다.
제가 속한 조직에서는 enum
을 선택해서 사용했는데요!
결론적으로 enum
을 선택해서 사용한 의견에 대해서도 알아보려고 합니다.
enum
은 열거형 변수로 정수를 하나로 합칠 때 편리한 기능입니다.
임의의 숫자나 문자열을 할당할 수 있으며 하나의 유형으로 사용해서 버그를 줄일 수 있습니다.
// 아무것도 지정하지 않은 경우에는 0부터 숫자를 매깁니다.
enum MOBILE_OS {
IOS, // 0
ANDROID // 1
}
// 임의의 숫자나 문자열을 할당할 수도 있습니다
enum MOBILE_OS {
IOS = 'iOS',
ANDROID = 'Android'
}
enum
은 타입스크립트가 자체적으로 구현하는 기능입니다.
enum
을 사용하지 않는 것을 권장하는 것 중 제일 큰 이유가 tree-shaking
입니다.
enum
을 사용하게 되면 tree-shaking
이 되지 않습니다.
왜냐하면 타입스크립트가 자체적으로 구현했기 때문에 타입스크립트는 자바스크립트로 변환할 때 IIFE
(즉시 실행 함수)를 포함한 코드를 생성합니다.
하지만 rollup
과 같은 번들러는 IIFE
를 사용하지 않는 코드라고 판단할 수 없어서 tree-shaking
이 되지 않습니다.
결과적으로 사용하지 않는 코드들도 최종 번들에는 포함되어 있습니다.
enum CountryCode1 {
'Argentina' = 'AR',
'China' = 'CN',
'Korea' = 'KR',
}
장점
1. key
값에 의미 있는 값을 부여할 수 있습니다.
2. 타입에 enum을 지정하면 따로 key
에 대한 타입을 만들지 않아도 돼서 편리합니다.
3. Object.keys
, Object.entries
를 이용해서 값들에 대한 순회가 편리합니다.
(number
타입의 value
사용하지 않을 때)
4. enum
을 쓰는 쪽에서는 오타를 낼 확률이 0%가 됩니다. 무조건 enum
값으로 써야 하기 때문입니다.(number
타입의 value
사용하지 않을 때)
5. value
가 number
형일 때, 양방향 매핑이 가능합니다.
단점
1. tree-shaking
이 되지 않습니다.
2. 자바스크립트로 변환되고 나면 비교적 용량이 커집니다.
3. number
타입의 value
가 있다면 문제가 발생합니다.
4. value
가 number
형일 때, 양방향 매핑이 가능합니다.
const enum CountryCode2 {
'Argentina' = 'AR',
'China' = 'CN',
'Korea' = 'KR',
}
장점
1. tree-shaking
이 됩니다.
2. 자바스크립트로 변환되고 나면, 매우 적은 용량을 차지합니다.
3. key
값에 의미 있는 값을 부여할 수 있습니다.
4. enum
을 쓰는 쪽에서는 오타를 낼 확률이 0%가 됩니다. 무조건 enum
값으로 써야 하기 때문입니다.(number
타입의 value
사용하지 않을 때)
단점
1. Object.keys
, Object.entries
를 이용해서 값들에 대해 순회를 할 수가 없습니다.
2. –isolatedModules
옵션을 사용하면, 사용 불가합니다.
3. 타입스크립트 패키지를 만들고, 이를 다른 곳에서 사용한다면, 이를 타입용으로 사용할 수가 없습니다.
4. CRA
, Next.js
에서 사용 불가합니다.
5. babel
설정도 추가로 필요합니다.
const CountryCode3 = {
'Argentina': 'AR',
'China': 'CN',
'Korea': 'KR',
} as const
type CountryCode3Type = typeof CountryCode3[keyof typeof CountryCode3] // 이렇게 별도의 union type을 지정해줘야 함
장점
1. tree-shaking
이 됩니다.
2. 자바스크립트로 변환되고 나면, 매우 적은 용량을 차지합니다.
3. Object.keys
, Object.entries
를 이용해서 값들에 대한 순회가 편리합니다.
4. key
값에 의미 있는 값을 부여할 수 있습니다.
단점
1. 이것을 위한 별도의 union type
을 만들어야 해서, 성가십니다.
2. 원래의 의도가 enum
과는 다르기 때문에, 쓰기가 약간은 망설여집니다.
대부분의 enum
을 사용하지 않는 것을 권장하는 이유는 tree-shaking
이었습니다!
하지만 저는 우아한형제들이 고민한 enum
에 대한 의견에 조금 더 공감이 됐습니다.
enum
을 선택한 이유tree-shaking
이 되지 않는다고 해도, enum
선언부가 엄청나게 크지 않는 이상, 이런 정도의 용량 다이어트가 필요한지 의문이다.tree-shaking
이 가능하기도 하다. (rollup
은 불가능, vite
는 가능)enum
을 쓰되, enum
의 단점을 최소화하고 장점을 극대화시키기 위해서 value
는 string
형으로 사용한다.정도가 될 것 같습니다!
위의 설명된 이유에 추가적으로 오타가 날 확률이 없다는 것도 저한테는 매우 매력적인 장점이라고 생각했습니다.
조금 더 자세한 설명을 확인하고 싶다면 하단의 출처를 확인해주세요!