You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
대개는 두 번째 방식으로 모듈을 만드는 걸 선호하기 때문에 함수, 클래스, 변수 등의 개체는 전용 모듈 안에 구현됩니다.
162
162
163
-
그런데 이렇게 모듈을 만들다 보면 파일 수가 많아질 수밖에 없습니다. 그렇더라도 모듈 이름을 잘 지어주고, 폴더에 파일을 잘 나눠 프로젝트를 구성하면 코드 탐색이 어렵지 않으므로 이는 전혀 문제가 되지 않습니다.
163
+
그런데 이렇게 모듈을 만들다 보면 자연스레 파일 개수가 많아질 수밖에 없습니다. 그렇더라도 모듈 이름을 잘 지어주고, 폴더에 파일을 잘 나눠 프로젝트를 구성하면 코드 탐색이 어렵지 않으므로 이는 전혀 문제가 되지 않습니다.
164
164
165
-
`export default`라는 특별한 문법을 사용하면 '개체가 하나만 있는 모듈'을 더 잘 표시할 수 있습니다. 이런 방식을 'default export(기본 내보내기)'라고 합니다.
165
+
모듈은 `export default`라는 특별한 문법을 지원합니다. `export default`를 사용하면 '해당 모듈엔 개체가 하나만 있다'는 사실을 명확히 나태낼 수 있습니다.
166
166
167
167
내보내고자 하는 개체 앞에 `export default`를 붙여봅시다.
168
168
@@ -181,7 +181,7 @@ export *!*default*/!* class User { // export 옆에 'default'를 추가해보았
181
181
182
182
```js
183
183
// 📁 main.js
184
-
import *!*User*/!* from './user.js'; // {User}를 사용하지 않고 중괄호 없이 User 클래스를 가져왔습니다.
184
+
import *!*User*/!* from './user.js'; // {User}가 아닌 User로 클래스를 가져왔습니다.
185
185
186
186
new User('John');
187
187
```
@@ -193,9 +193,9 @@ new User('John');
193
193
|`export class User {...}`|`export default class User {...}`|
194
194
|`import {User} from ...`|`import User from ...`|
195
195
196
-
사실 named export와 defaultexport를 같은 모듈에서 동시에 사용해도 괜찮습니다. 그런데 실무에선 이렇게 섞어 쓰는 사례가 흔치 않고, 한 파일엔 namedexport나 defaultexport 둘 중 하나만 사용합니다.
196
+
사실 named export와 defaultexport를 같은 모듈에서 동시에 사용해도 문제는 없습니다. 그런데 실무에선 이렇게 섞어 쓰는 사례가 흔치 않습니다. 한 파일엔 namedexport나 defaultexport 둘 중 하나만 사용합니다.
197
197
198
-
파일당 최대 하나의 default export가 있을 수 있으므로 내보낼 엔티티엔 이름이 없어도 괜찮습니다.
198
+
파일당 최대 하나의 default export가 있을 수 있으므로 내보낼 개체엔 이름이 없어도 괜찮습니다.
199
199
200
200
아래 예시의 개체엔 이름이 없지만 모두 에러 없이 잘 동작합니다.
201
201
@@ -228,7 +228,7 @@ export class { // 에러! (default export가 아닌 경우엔 이름이 꼭 필
228
228
229
229
### 'default' name
230
230
231
-
몇몇 상황에서 `default` 키워드는 기본 내보내기를 참조하는 용도로 사용됩니다.
231
+
`default` 키워드는 기본 내보내기를 참조하는 용도로 종종 사용됩니다.
232
232
233
233
함수를 내보낼 때 아래와 같이 함수 선언부와 떨어진 곳에서 `default` 키워드를 사용하면, 해당 함수를 기본 내보내기 할 수 있습니다.
234
234
@@ -265,7 +265,7 @@ import {*!*default as User*/!*, sayHi} from './user.js';
265
265
new User('John');
266
266
```
267
267
268
-
`*` 를 사용할 수도 있는데, 이렇게 객체 형태로 모든 걸 가져온 경우엔 `default` 프로퍼티는 정확히 default export를 가리킵니다.
268
+
`*` 를 사용해 모든 것을 객체 형태로 가져오는 방법도 있는데, 이 경우엔 `default` 프로퍼티는 정확히 default export를 가리킵니다.
269
269
270
270
```js
271
271
// 📁 main.js
@@ -279,22 +279,22 @@ new User('John');
279
279
280
280
named export는 내보냈을 때 사용한 이름 그대로 가져오므로 관련 정보를 파악하기 쉽습니다.
281
281
282
-
다만 아래와 같이 내보내기 할 때 쓴 이름과 가져오기 할 때 쓸 이름이 동일해야 한다는 제약이 있죠.
282
+
그런데 아래와 같이 내보내기 할 때 쓴 이름과 가져오기 할 때 쓸 이름이 동일해야 한다는 제약이 있죠.
283
283
284
284
```js
285
285
import {User} from './user.js';
286
286
// import {MyUser}은 사용할 수 없습니다. 반드시 {User}이어야 합니다.
287
287
```
288
288
289
-
이와는 다르게 default export는 가져오기 할 때 개발자가 원하는 대로 이름을 지정해 줄 수 있습니다.
289
+
named export와는 다르게 defaultexport는 가져오기 할 때 개발자가 원하는 대로 이름을 지정해 줄 수 있습니다.
290
290
291
291
```js
292
292
import User from './user.js'; // 동작
293
293
import MyUser from './user.js'; // 동작
294
294
// 어떤 이름이든 에러 없이 동작합니다.
295
295
```
296
296
297
-
그런데 이렇게 자유롭게 이름을 짓다 보면 같은 걸 가져오는데도 이름이 다를 수 있기 때문에 혼란의 여지가 생깁니다.
297
+
그런데 이렇게 자유롭게 이름을 짓다 보면 같은 걸 가져오는데도 이름이 달라 혼란의 여지가 생길 수 있습니다.
298
298
299
299
이런 문제를 예방하고 코드의 일관성을 유지하기 위해 default export 한 것을 가져올 땐 아래와 같이 파일 이름과 동일한 이름을 사용하도록 팀원끼리 내부 규칙을 정할 수 있습니다.
300
300
@@ -305,23 +305,23 @@ import func from '/path/to/func.js';
305
305
...
306
306
```
307
307
308
-
그런데 위와 같은 규칙을 만들었더라도 누군가는 이를 지키지 않을 수 있기 때문에 어떤 팀은 named export만 사용할 것을 강제하는 경우도 있습니다. 모듈 하나에서 단 하나의 개체만 내보내는 경우에도 `default` 없이 이름을 붙여 내보내면 혼란을 방지할 수 있기 때문이죠.
308
+
그런데 규칙이 있어도 이를 지키지 않는 사람이 있을 수 있기 때문에 어떤 팀은 named export만 사용할 것을 강제하는 경우도 있습니다. 모듈 하나에서 단 하나의 개체만 내보내는 경우에도 `default` 없이 이름을 붙여 내보내면 혼란을 방지할 수 있기 때문이죠.
309
309
310
310
이런 규칙은 아래에서 배울 모듈 다시 내보내기를 쉽게 해준다는 장점도 있습니다.
311
311
312
-
## export ... from ...으로 다시 내보내기
312
+
## 모듈 다시 내보내기
313
313
314
-
`export ... from ...` 문법을 사용하면 가져온 것을 즉시 '다시 내보내기(re-export)' 할 수 있습니다. 이름을 바꿔서 내보낼 수도 있습니다. 예시를 살펴봅시다.
314
+
`export ... from ...` 문법을 사용하면 가져온 개체를 즉시 '다시 내보내기(re-export)' 할 수 있습니다. 이름을 바꿔서 다시 내보낼 수 있는 것이죠. 예시를 살펴봅시다.
315
315
316
316
```js
317
317
export {sayHi} from './say.js'; // sayHi를 다시 내보내기 함
318
318
319
319
export {default as User} from './user.js'; // default export를 다시 내보내기 함
320
320
```
321
321
322
-
다시 내보내기를 왜 해야 하는지 의문이 드실 겁니다. 유스 케이스를 통해 다시 내보내기가 실무에서 언제 사용되는지 알아봅시다.
322
+
다시 내보내기가 왜 필요한건지 의문이 드실 겁니다. 유스 케이스를 통해 다시 내보내기가 실무에서 언제 사용되는지 알아봅시다.
323
323
324
-
NPM을 통해 외부에 공개할 '패키지(package)'를 만들고 있다고 가정합시다. 이 패키지는 수많은 모듈로 구성되어있는데 몇몇 모듈은 외부에 공개할 기능을, 몇몇 모듈은 이러한 모듈을 도와주는 '헬퍼' 역할을 담당하고 있습니다.
324
+
NPM을 통해 외부에 공개할 '패키지(package)'를 만들고 있다고 가정합시다. 이 패키지는 수많은 모듈로 구성되어있는데, 몇몇 모듈은 외부에 공개할 기능을, 몇몇 모듈은 이러한 모듈을 도와주는 '헬퍼' 역할을 담당하고 있다고 합시다.
325
325
326
326
패키지 구조는 아래와 같습니다.
327
327
```
@@ -337,15 +337,15 @@ auth/
337
337
...
338
338
```
339
339
340
-
진입점 역할을 하는 '주요 파일'인 `auth/index.js`을 통해 기능을 외부에 노출시키면 이 패키지를 사용하는 개발자들은 아래와 같은 코드로 해당 기능을 사용할 겁니다.
340
+
진입점 역할을 하는 '주요 파일'인 `auth/index.js`을 통해 기능을 외부에 노출시키면 이 패키지를 사용하는 개발자들은 아래와 같은 코드로 해당 기능을 사용할 겁니다.
341
341
342
342
```js
343
343
import {login, logout} from 'auth/index.js'
344
344
```
345
345
346
-
이때 우리가 만든 패키지를 사용하는 외부 개발자가 패키지 안의 파일들을 뒤져 내부 구조를 건드리게 하면 안 됩니다. 공개할 것만 `auth/index.js`에 넣어 내보내기 하고 나머는 숨기는 게 좋겠죠.
346
+
이때 우리가 만든 패키지를 사용하는 외부 개발자가 패키지 안의 파일들을 뒤져 내부 구조를 건드리게 하면 안 됩니다. 그러려면 공개할 것만 `auth/index.js`에 넣어 내보내기 하고 나머는 숨기는 게 좋겠죠.
347
347
348
-
내보낼 기능을 패키지 전반에 분산하여 구현한 후, `auth/index.js`에서 이 기능들을 가져오고 이를 다시 내보내면 원하는 바를 어느 정도 달성할 수 있습니다.
348
+
이때 내보낼 기능을 패키지 전반에 분산하여 구현한 후, `auth/index.js`에서 이 기능들을 가져오고 이를 다시 내보내면 원하는 바를 어느 정도 달성할 수 있습니다.
349
349
350
350
```js
351
351
// 📁 auth/index.js
@@ -354,15 +354,15 @@ import {login, logout} from 'auth/index.js'
354
354
import {login, logout} from'./helpers.js';
355
355
export {login, logout};
356
356
357
-
//User 가져온 후 바로 내보냅니다.
357
+
//User를 가져온 후 바로 내보냅니다.
358
358
importUserfrom'./user.js';
359
359
export {User};
360
360
...
361
361
```
362
362
363
363
이제 외부 개발자들은 `import {login} from "auth/index.js"`로 우리가 만든 패키지를 이용할 수 있습니다.
364
364
365
-
`export ... from ...`는 위와 같이 개체를 가지고 온 후 바로 내보낼 때 쓸 수 있는 문법입니다. 아래 예시는 위 예시와 동일하게 동작합니다.
365
+
`export ... from ...`는 위와 같이 개체를 가지고 온 후 바로 내보낼 때 쓸 수 있는 문법입니다. 아래 예시는 위 예시와 동일하게 동작합니다.
366
366
367
367
```js
368
368
// 📁 auth/index.js
@@ -376,7 +376,7 @@ export {default as User} from './user.js';
376
376
377
377
### default export 다시 내보내기
378
378
379
-
기본 내보내기는 다시 내보낼 땐 주의할 사항이 있습니다.
379
+
기본 내보내기를 다시 내보낼 때는 주의해야 할 점들이 있습니다.
380
380
381
381
`user.js` 내의 클래스 `User`를 다시 내보내기 한다고 가정해 봅시다.
382
382
@@ -387,13 +387,13 @@ export default class User {
387
387
}
388
388
```
389
389
390
-
1.`export User from './user.js'`로 다시 내보내기를 시도하면 문법 에러가 발생합니다.
390
+
1.`User`를 `export User from './user.js'`로 다시 내보내기 할 때 문법 에러가 발생합니다. 어디가 잘못된 걸까요?
391
391
392
-
default export를 다시 내보내려면 위 예시처럼 `export {default as User}`를 사용해야 합니다.
392
+
default export를 다시 내보내려면 위 예시처럼 `export {default as User}`를 사용해야 합니다.
393
393
394
394
2.`export * from './user.js'`를 사용해 모든 걸 한 번에 다시 내보내면 default export는 무시되고, named export만 다시 내보내집니다.
395
395
396
-
두 가지를 동시에 다시 내보내고 싶다면 두 구문을 동시에 사용해야 합니다.
396
+
두 가지를 동시에 다시 내보내고 싶다면 두 문을 동시에 사용해야 합니다.
397
397
```js
398
398
export*from'./user.js'; // named export를 다시 내보내기
399
399
export {default} from'./user.js'; // default export를 다시 내보내기
@@ -413,8 +413,8 @@ default export를 다시 내보낼 땐 이런 특이한 상황도 인지하고
413
413
-`export {x [as y], ...}`.
414
414
- 다시 내보내기:
415
415
-`export {x [as y], ...} from "module"`
416
-
-`export * from "module"` (doesn't re-export default).
417
-
- `export {default [as y]} from "module"` (re-export default).
416
+
-`export * from "module"` (default export는 다시 내보내 지지 않음)
417
+
-`export {default [as y]} from "module"` (defaultexport를 다시 내보냄)
0 commit comments