비공식 사이트. 24.12.31. 폐쇄예정
공식사이트 바로가기

Importing and Exporting Components컴포넌트 import 및 export

The magic of components lies in their reusability: you can create components that are composed of other components. But as you nest more and more components, it often makes sense to start splitting them into different files. This lets you keep your files easy to scan and reuse components in more places. 컴포넌트의 가장 큰 장점은 재사용성으로 컴포넌트를 조합해 또 다른 컴포넌트를 만들 수 있습니다. 컴포넌트를 여러 번 중첩하게 되면 다른 파일로 분리해야 하는 시점이 생깁니다. 이렇게 분리하면 나중에 파일을 찾기 더 쉽고 재사용하기 편리해집니다.

You will learn학습 내용

  • What a root component file is
  • How to import and export a component
  • When to use default and named imports and exports
  • How to import and export multiple components from one file
  • How to split components into multiple files
  • 루트 컴포넌트란 무엇인지
  • 컴포넌트를 import하고 export하는 방법
  • default 및 이름 있는 import / export 를 사용해야 하는 경우
  • 하나의 파일에서 여러 컴포넌트를 import / export 하는 방법
  • 컴포넌트를 여러 파일로 분할하는 방법

The root component file루트 컴포넌트 파일

In Your First Component, you made a Profile component and a Gallery component that renders it: 첫번째 컴포넌트에서 만든 Profile 컴포넌트와 Gallery 컴포넌트는 아래와 같이 렌더링 됩니다:

function Profile() {
  return (
    <img
      src="https://i.imgur.com/MK3eW3As.jpg"
      alt="Katherine Johnson"
    />
  );
}

export default function Gallery() {
  return (
    <section>
      <h1>Amazing scientists</h1>
      <Profile />
      <Profile />
      <Profile />
    </section>
  );
}

These currently live in a root component file, named App.js in this example. Depending on your setup, your root component could be in another file, though. If you use a framework with file-based routing, such as Next.js, your root component will be different for every page. 이 예제의 컴포넌트들은 모두 App.js라는 root 컴포넌트 파일에 존재합니다. 설정에 따라 root 컴포넌트가 다른 파일에 위치할 수도 있습니다. Next.js처럼 파일 기반으로 라우팅하는 프레임워크일 경우 페이지별로 root 컴포넌트가 다를 수 있습니다.

Exporting and importing a component컴포넌트 import 및 export하기

What if you want to change the landing screen in the future and put a list of science books there? Or place all the profiles somewhere else? It makes sense to move Gallery and Profile out of the root component file. This will make them more modular and reusable in other files. You can move a component in three steps: 나중에 랜딩 화면을 변경하여 과학 도서 목록을 넣으려면 어떻게 해야 하나요? 아니면 모든 프로필을 다른 곳에 배치하고자 한다면? GalleryProfile을 root 컴포넌트 파일 밖으로 옮기는 것이 좋을 것 같습니다. 이렇게 하면 보다 모듈성이 강화되고 다른 파일에서 재사용할 수 있게 됩니다. 컴포넌트는 다음 세 단계로 이동할 수 있습니다.

  1. Make a new JS file to put the components in.
  2. Export your function component from that file (using either default or named exports).
  3. Import it in the file where you’ll use the component (using the corresponding technique for importing default or named exports).
  1. 컴포넌트를 넣을 JS 파일을 생성합니다.
  2. 새로 만든 파일에서 함수 컴포넌트를 export 합니다. (default 또는 named export 방식을 사용합니다.)
  3. 컴포넌트를 사용할 파일에서 import 합니다. (default 또는 named export에 대응하는 방식으로 import 합니다.)

Here both Profile and Gallery have been moved out of App.js into a new file called Gallery.js. Now you can change App.js to import Gallery from Gallery.js: 여기서 ProfileGallery는 모두 App.js에서 Gallery.js라는 새 파일로 이동했습니다. 이제 App.js를 변경하여 Gallery.js에서 Gallery를 import할 수 있습니다:

import Gallery from './Gallery.js';

export default function App() {
  return (
    <Gallery />
  );
}

Notice how this example is broken down into two component files now: 이제 이 예제에서는 컴포넌트들이 두 파일로 나뉘게 되었습니다:

  1. Gallery.js:
    • Defines the Profile component which is only used within the same file and is not exported.
    • Exports the Gallery component as a default export.
    • 동일한 파일 내에서만 사용되며 export하지 않는 Profile 컴포넌트를 정의합니다.
    • Gallery 컴포넌트를 default export 방식으로 export 합니다.
  2. App.js:
    • Imports Gallery as a default import from Gallery.js.
    • Exports the root App component as a default export.
    • GalleryGallery.js로부터 default import 방식으로 import 합니다.
    • root App 컴포넌트를 default export 방식으로 export 합니다.

Note

You may encounter files that leave off the .js file extension like so: 가끔 .js와 같은 파일 확장자가 없는 때도 있습니다.

import Gallery from './Gallery';

Either './Gallery.js' or './Gallery' will work with React, though the former is closer to how native ES Modules work. React에서는 './Gallery.js' 또는 './Gallery' 둘 다 사용할 수 있지만 전자의 경우가 ES Modules 사용 방법에 더 가깝습니다.

Deep Dive | 심층 탐구

Default vs named exports

There are two primary ways to export values with JavaScript: default exports and named exports. So far, our examples have only used default exports. But you can use one or both of them in the same file. A file can have no more than one default export, but it can have as many named exports as you like. 보통 JavaScript에서는 default export와 named export라는 두 가지 방법으로 값을 export 합니다. 지금까지의 예제에서는 default export만 사용했지만 두 방법 다 한 파일에서 사용할 수도 있습니다. 다만 한 파일에서는 하나의 default export만 존재할 수 있고 named export는 여러 개가 존재할 수 있습니다.

Default and named exports

How you export your component dictates how you must import it. You will get an error if you try to import a default export the same way you would a named export! This chart can help you keep track: Export 하는 방식에 따라 import 하는 방식이 정해집니다. Default export로 한 값을 named import로 가져오려고 하려면 에러가 발생합니다. 아래 표에는 각각의 경우의 문법이 정리되어 있습니다.

SyntaxExport statementImport statement
Defaultexport default function Button() {}import Button from './Button.js';
Namedexport function Button() {}import { Button } from './Button.js';

When you write a default import, you can put any name you want after import. For example, you could write import Banana from './Button.js' instead and it would still provide you with the same default export. In contrast, with named imports, the name has to match on both sides. That’s why they are called named imports! default import를 사용하는 경우 원한다면 import 단어 후에 다른 이름으로 값을 가져올 수 있습니다. 예를 들어, import Banana from './button.js' 라고 쓰더라도 같은 default export 값을 가져오게 됩니다. 반대로 named import를 사용할 때는 양쪽 파일에서 사용하고자 하는 값의 이름이 같아야 해서 named import라고 불립니다.

People often use default exports if the file exports only one component, and use named exports if it exports multiple components and values. Regardless of which coding style you prefer, always give meaningful names to your component functions and the files that contain them. Components without names, like export default () => {}, are discouraged because they make debugging harder. 보편적으로 한 파일에서 하나의 컴포넌트만 export 할 때 default export 방식을 사용하고 여러 컴포넌트를 export 할 경우엔 named export 방식을 사용합니다. 어떤 방식을 사용하든 컴포넌트와 파일의 이름을 의미 있게 명명하는 것은 중요합니다. export default () => {} 처럼 이름 없는 컴포넌트는 나중에 디버깅하기 어렵기 때문에 권장하지 않습니다.

Exporting and importing multiple components from the same file동일한 파일에서 여러 컴포넌트 import 및 export하기

What if you want to show just one Profile instead of a gallery? You can export the Profile component, too. But Gallery.js already has a default export, and you can’t have two default exports. You could create a new file with a default export, or you could add a named export for Profile. A file can only have one default export, but it can have numerous named exports! 갤러리 대신 하나의 Profile만 표시하고 싶다면 어떻게 해야 하나요? Profile 컴포넌트도 export 할 수 있습니다. 하지만 Gallery.js에는 이미 default export가 있으며, default export를 두 개 가질 수는 없습니다. 새 파일을 만들어 default export 하거나, 혹은Profile에서 named export를 추가할 수도도 있습니다. 한 파일은 default export를 하나만 가질 수 있지만, named export는 여러 개 가질 수 있습니다!

Note

To reduce the potential confusion between default and named exports, some teams choose to only stick to one style (default or named), or avoid mixing them in a single file. Do what works best for you! default export와 named export 사이의 잠재적인 혼동을 줄이기 위해 일부 팀에서는 한 가지 스타일(default 또는 named)만 고수하거나, 단일 파일 내에서 혼합하지 않도록 선택합니다. 자신에게 가장 적합한 방식을 선택하세요!

First, export Profile from Gallery.js using a named export (no default keyword): 먼저 named export 방식을 사용해서 Gallery.js에서 Profileexport 합니다. (default 키워드를 사용하지 않습니다):

export function Profile() {
// ...
}

Then, import Profile from Gallery.js to App.js using a named import (with the curly braces): 그 다음엔 named import 방식으로 Gallery.js에서 ProfileApp.js 파일로 import 합니다 (중괄호를 사용합니다):

import { Profile } from './Gallery.js';

Finally, render <Profile /> from the App component: 마지막으로 <Profile />App 컴포넌트에서 렌더링합니다:

export default function App() {
return <Profile />;
}

Now Gallery.js contains two exports: a default Gallery export, and a named Profile export. App.js imports both of them. Try editing <Profile /> to <Gallery /> and back in this example: 이제 Gallery.js에는 default Gallery export와 named Profile export라는 두 가지의 export가 존재합니다. App.js에서는 두 컴포넌트를 import 해서 사용합니다. 아래의 예제에서 <Profile /><Gallery />를 교차해서 사용해 보세요:

import Gallery from './Gallery.js';
import { Profile } from './Gallery.js';

export default function App() {
  return (
    <Profile />
  );
}

Now you’re using a mix of default and named exports: 이제 default와 named export 방식 둘 다 사용할 수 있게 됐습니다:

  • Gallery.js:
    • Exports the Profile component as a named export called Profile.
    • Exports the Gallery component as a default export.
    • Profile 컴포넌트를 Profilenamed export 합니다.
    • Gallery 컴포넌트를 default export 합니다.
  • App.js:
    • Imports Profile as a named import called Profile from Gallery.js.
    • Imports Gallery as a default import from Gallery.js.
    • Exports the root App component as a default export.
    • Gallery.js에서 ProfileProfilenamed import 합니다.
    • Gallery.js에서 Gallerydefault import 합니다.
    • root App 컴포넌트를 default export 합니다.

Recap요약

On this page you learned: 이 페이지에서 배우게 된 것들입니다:

  • What a root component file is
  • How to import and export a component
  • When and how to use default and named imports and exports
  • How to export multiple components from the same file
  • Root 컴포넌트란 무엇인지
  • 컴포넌트를 import 하거나 export 하는 방법
  • 언제, 어떻게 default 및 named import, default 및 named export를 사용하는지
  • 한 파일에서 여러 컴포넌트를 export 하는 방법

Challenge 1 of 1: Split the components further컴포넌트를 더 분리해 봅시다

Currently, Gallery.js exports both Profile and Gallery, which is a bit confusing. 현재 Gallery.jsProfileGallery를 모두 export하고 있으므로 약간 혼란스러울 수 있습니다.

Move the Profile component to its own Profile.js, and then change the App component to render both <Profile /> and <Gallery /> one after another. Profile.js 파일을 생성해서 Profile 컴포넌트를 해당 파일로 옮기고 App 컴포넌트에서는 <Profile /><Gallery />를 각각 렌더링하도록 변경하세요.

You may use either a default or a named export for Profile, but make sure that you use the corresponding import syntax in both App.js and Gallery.js! You can refer to the table from the deep dive above: Profile에 default export 또는 named export를 사용할 수 있는데, App.jsGallery.js 모두에서 그에 대응하는 import 구문을 사용해야 한다는 점을 주의하세요! Deep Dive의 표(아래)를 참고하세요:

SyntaxExport statementImport statement
Defaultexport default function Button() {}import Button from './Button.js';
Namedexport function Button() {}import { Button } from './Button.js';
// Move me to Profile.js!
export function Profile() {
  return (
    <img
      src="https://i.imgur.com/QIrZWGIs.jpg"
      alt="Alan L. Hart"
    />
  );
}

export default function Gallery() {
  return (
    <section>
      <h1>Amazing scientists</h1>
      <Profile />
      <Profile />
      <Profile />
    </section>
  );
}

After you get it working with one kind of exports, make it work with the other kind. export 방식 중 하나로 동작하는 데에 성공했다면, 다른 방식으로도 바꿔보세요.