안녕하세요?
React를 사용하면서 느끼는 의문이 있었는데요.
바로 “named export와 default export 중 어느 것을 사용하는 것이 좋을까?”라는 생각이었습니다.
그래서 여러 가지 생각나는데로 적어보았습니다.
개인적인 해석이므로, 오류가 있을 수 있으니 참고 바랍니다.
Default export
default export의 예제입니다.
// default export
export default function sampleFunc() {
return "hoge";
}
그리고 import 할 때 사용하는 방법은 아래와 같습니다.
import sampleFunc from "./path";
Named export
named export 입니다.
export function sampleFunc() {
return "hoge";
}
import는 아래와 같이 컬리브레이스 안에 이름을 넣어야 합니다.
import { sampleFunc } from "./path";
차이점
default export의 경우 import 할 때 모듈 이름을 변경할 수 있습니다.
export default function sampleFunc() {
return "hello";
}
위와 같이 sampleFunc 이름으로 default export 되었지만 아래와 같이 import 시 이름을 바꿔서 import 해도 아무 문제 없습니다.
import renamedSampleFunc from "./path"; // <- 모듈 이름 변경
반면, named export 의 경우 에러가 발생하므로 꼭 아래와 같이 작성해야 합니다.
export function sampleFunc() {
return message;
}
위와 같이 sampleFunc 이름으로 export 했으면 아래와 같이 이름을 바꿔서 임포트 할 수 있습니다.
import { sampleFunc as renamedSampleFunc } from "./path";
또 named export를 여러 개 export가 가능합니다.
default export 에서는 할 수 없는 기능입니다.
export const message = "Hello, world!";
export function sampleFunc() {
return message;
}
아래와 같이 named export 가 된 2개를 동시에 import 할 수 있습니다.
import { message, sampleFunc } from "./path";
결론
Next.js의 Page 파일 등 예외는 있지만, 저는 앞으로 named export 만 쓰고 싶네요.
주된 이유는 다음 두 가지입니다.
- import의 일관성 :기본적으로 default export 로 프로젝트를 진행하고 있었다고 가정했을 때, 중간에 여러 모듈을 export 해야 하는 경우 아래와 같아지면 조금 어색합니다.
import DefaultExportFunc from "./path";
import { NamedExportFunc, NamedExportVar } from "./path";
- 명시적인 리네임 : default export 의 경우 import 문을 오타로 작성하면 리네임으로 처리되어 의도치 않게 그대로 사용될 수 있습니다.
또한, 경로가 잘못되었더라도 해당 경로에 default export 된 TypeScript 파일이 있을 경우, 그 파일을 리네임해서 import하게 될 수도 있습니다.
// sample의 'e'가 빠져있음
import samplFunc from "./path"; // <- 그대로 통과
import { samplFunc } from "./path"; // <- 에러
전체적으로 named export가 더 좋은 이유는 구글 검색하면 보통 아래와 같이 나오니 참고 바랍니다.
테스트 용이성: named export 는 테스트를 더 쉽게 만들어줍니다. 각 함수나 변수를 개별적으로 import하여 테스트할 수 있기 때문입니다. 반면에, default export 는 전체 모듈을 import해야 하므로 테스트가 복잡해질 수 있습니다.
자동완성과 도구 지원: 대부분의 코드 에디터는 named export 를 더 잘 지원합니다. 자동완성 기능을 사용하면 모듈에서 내보낸 모든 것을 쉽게 볼 수 있습니다. default export 의 경우, 이러한 도구 지원이 제한적일 수 있습니다.
명확성과 가독성: named export 는 코드를 읽는 사람에게 더 명확한 정보를 제공합니다.import문을 보면 어떤 함수나 변수가 사용되는지 바로 알 수 있습니다. default export 의 경우, import문만으로는 어떤 것이 내보내진 것인지 알 수 없습니다.
리팩토링 용이성: named export 는 리팩토링을 더 쉽게 만들어줍니다. 특정 함수나 변수의 이름을 변경하면, 해당 이름을 import하는 모든 곳에서 에러가 발생하므로 쉽게 찾아낼 수 있습니다. default export 의 경우, 이름을 변경해도 에러가 발생하지 않으므로 문제를 찾기 어렵습니다.
이러한 이유로, 저는 일반적으로 named export 를 선호합니다.
때때로는 상황에 따라 default export가 더 적합한 경우도 있습니다.
예를 들어, 모듈이 하나의 주요 함수를 export 하고 다른 export는 이를 지원하는 작은 함수나 변수인 경우, default export 를 사용하는 것이 더 자연스러울 수 있습니다.
이러한 결정은 온전히 코딩하는 개발자의 판단에 달려 있다고 생각합니다.
그럼.
'Javascript' 카테고리의 다른 글
JavaScript의 Promise, 그것이 알고싶다 (0) | 2024.02.13 |
---|---|
TypeScript에서 webpack과 Babel의 필요성을 역사적 관점에서 본다 (1) | 2024.02.13 |
튜토리얼로 배우는 Zod 라이브러리 (타입스크립트 스키마 선언 및 검증) (1) | 2024.02.13 |
React Server Components와 Next.js App Router 제대로 이해하기 (0) | 2024.02.13 |
TypeScript에서 `infer` 키워드 활용하기 (0) | 2024.02.13 |