TypeScript의 enum
은 코드의 가독성을 높이는 데 유용하지만, 성능 최적화 측면에서 몇 가지 단점을 가지고 있습니다. 특히 트리 쉐이킹(Tree Shaking)과 관련하여 enum
사용을 피해야 하는 이유에 대해 알아보겠습니다.
트리 쉐이킹은 사용되지 않는 코드를 제거하여 최종 번들 크기를 줄이는 기법입니다. 주로 ES6 모듈을 사용하는 환경에서 효과적으로 작동하며, 모듈 번들러(예: Webpack, Rollup)가 이를 수행합니다. 사용되지 않는 코드가 번들에 포함되지 않도록 정적 분석을 통해 이루어집니다.
TypeScript의 enum
은 컴파일될 때 런타임 객체로 변환됩니다. 이로 인해 enum
의 모든 값이 최종 번들에 포함됩니다. 예를 들어, 아래의 enum
예시를 살펴보겠습니다:
enum Status {
Pending = "pending",
Approved = "approved",
Rejected = "rejected",
}
위의 코드에서 Status
enum은 세 개의 문자열 값을 포함합니다. 코드에서 Status
enum의 일부 값만 사용하더라도, 모든 값이 최종 번들에 포함될 수 있습니다.
enum
은 런타임에 존재하는 객체이므로, 사용되지 않는 값이 코드에 남아있게 됩니다. 이는 트리 쉐이킹이 제대로 작동하지 않는 원인이 됩니다.enum
의 값들이 런타임에 필요하기 때문에, 사용되지 않는 값이 정적으로 분석되기 어렵습니다. 이로 인해 최종 번들에서 제거되지 않고 포함될 수 있습니다.function getStatusMessage(status: Status) {
switch (status) {
case Status.Pending:
return "Your request is pending.";
case Status.Approved:
return "Your request has been approved.";
case Status.Rejected:
return "Your request has been rejected.";
default:
return "Unknown status.";
}
}
위 코드에서 getStatusMessage
함수는 Status
enum의 값 중 일부만 사용할 수 있지만, 모든 값이 번들에 포함됩니다.
트리 쉐이킹을 최적화하기 위해 enum
대신 리터럴 타입과 유니언 타입을 사용하는 것이 좋습니다. 이를 통해 사용되지 않는 코드의 포함을 방지할 수 있습니다.
type Status = "pending" | "approved" | "rejected";
function getStatusMessage(status: Status) {
switch (status) {
case "pending":
return "Your request is pending.";
case "approved":
return "Your request has been approved.";
case "rejected":
return "Your request has been rejected.";
default:
return "Unknown status.";
}
}
위와 같이 리터럴 타입을 사용하면, 코드의 가독성을 유지하면서도 트리 쉐이킹의 이점을 극대화할 수 있습니다.
TypeScript의 enum
은 편리하지만, 트리 쉐이킹과 같은 성능 최적화 측면에서 문제가 될 수 있습니다. 코드의 최적화를 위해서는 리터럴 타입과 유니언 타입을 사용하는 것이 좋습니다. 이를 통해 최종 번들의 크기를 줄이고, 성능을 향상시킬 수 있습니다.