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

Your First Component첫번째 컴포넌트

Components are one of the core concepts of React. They are the foundation upon which you build user interfaces (UI), which makes them the perfect place to start your React journey! 컴포넌트는 React의 핵심 개념 중 하나입니다. 컴포넌트는 사용자 인터페이스(UI)를 구축하는 기반이 되므로 React 여정을 시작하기에 완벽한 곳입니다!

You will learn학습 내용

  • What a component is
  • What role components play in a React application
  • How to write your first React component
  • 컴포넌트가 무엇인지
  • React 어플리케이션에서 컴포넌트의 역할
  • 첫번째 React 컴포넌트를 작성하는 방법

Components: UI building blocks컴포넌트: UI 구성 요소

On the Web, HTML lets us create rich structured documents with its built-in set of tags like <h1> and <li>: 웹에서는 HTML을 통해 <h1>, <li>와 같은 태그를 사용하여 풍부한 구조의 문서를 만들 수 있습니다:

<article>
<h1>My First Component</h1>
<ol>
<li>Components: UI Building Blocks</li>
<li>Defining a Component</li>
<li>Using a Component</li>
</ol>
</article>

This markup represents this article <article>, its heading <h1>, and an (abbreviated) table of contents as an ordered list <ol>. Markup like this, combined with CSS for style, and JavaScript for interactivity, lies behind every sidebar, avatar, modal, dropdown—every piece of UI you see on the Web. 이 마크업은 아티클을 <article>로, 제목을 <h1>로, (축약된) 목차를 정렬된 목록 <ol>로 나타냅니다. 이와 같은 마크업은 스타일을 위한 CSS, 상호작용을 위한 JavaScript와 결합되어 웹에서 볼 수 있는 모든 사이드바, 아바타, 모달, 드롭다운 등 모든 UI의 기반이 됩니다.

React lets you combine your markup, CSS, and JavaScript into custom “components”, reusable UI elements for your app. The table of contents code you saw above could be turned into a <TableOfContents /> component you could render on every page. Under the hood, it still uses the same HTML tags like <article>, <h1>, etc. React를 사용하면 마크업, CSS, JavaScript를 앱의 재사용 가능한 UI 요소인 사용자 정의 “컴포넌트”로 결합할 수 있습니다. 위에서 본 목차 코드는 모든 페이지에 렌더링할 수 있는 <TableOfContents /> 컴포넌트로 전환될 수 있습니다. 내부적으로는 여전히 <article>, <h1> 등과 같은 동일한 HTML 태그를 사용합니다.

Just like with HTML tags, you can compose, order and nest components to design whole pages. For example, the documentation page you’re reading is made out of React components: HTML 태그와 마찬가지로 컴포넌트를 작성, 순서 지정 및 중첩하여 전체 페이지를 디자인할 수 있습니다. 예를 들어, 여러분이 읽고 있는 문서 페이지는 React 컴포넌트로 구성되어 있습니다:

<PageLayout>
<NavigationHeader>
<SearchBar />
<Link to="/docs">Docs</Link>
</NavigationHeader>
<Sidebar />
<PageContent>
<TableOfContents />
<DocumentationText />
</PageContent>
</PageLayout>

As your project grows, you will notice that many of your designs can be composed by reusing components you already wrote, speeding up your development. Our table of contents above could be added to any screen with <TableOfContents />! You can even jumpstart your project with the thousands of components shared by the React open source community like Chakra UI and Material UI. 프로젝트가 성장함에 따라 이미 작성한 컴포넌트를 재사용하여 많은 디자인을 구성할 수 있으므로 개발 속도가 빨라집니다. 위의 목차는 <TableOfContents />를 사용하여 어떤 화면에도 추가할 수 있습니다! Chakra UI, Material UI와 같은 React 오픈소스 커뮤니티에서 공유되는 수천 개의 컴포넌트로 프로젝트를 빠르게 시작할 수도 있습니다.

Defining a component컴포넌트 정의하기

Traditionally when creating web pages, web developers marked up their content and then added interaction by sprinkling on some JavaScript. This worked great when interaction was a nice-to-have on the web. Now it is expected for many sites and all apps. React puts interactivity first while still using the same technology: a React component is a JavaScript function that you can sprinkle with markup. Here’s what that looks like (you can edit the example below): 기존에는 웹 페이지를 만들 때 웹 개발자가 콘텐츠를 마크업한 다음 JavaScript를 뿌려 상호작용을 추가했습니다. 이는 웹에서 상호작용이 중요했던 시절에 효과적이었습니다. 이제는 많은 사이트와 모든 앱에서 상호작용을 기대합니다. React는 동일한 기술을 사용하면서도 상호작용을 우선시합니다. React 컴포넌트는 마크업으로 뿌릴 수 있는 JavaScript 함수입니다. 그 모습은 다음과 같습니다(아래 예시를 편집할 수 있습니다):

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

And here’s how to build a component: 컴포넌트를 빌드하는 방법은 다음과 같습니다:

Step 1: Export the component컴포넌트 내보내기

The export default prefix is a standard JavaScript syntax (not specific to React). It lets you mark the main function in a file so that you can later import it from other files. (More on importing in Importing and Exporting Components!) export default 접두사는 표준 JavaScript 구문입니다(React에만 해당되지 않음). 이 접두사를 사용하면 나중에 다른 파일에서 가져올 수 있도록 파일에 주요 기능을 표시할 수 있습니다. (더 자세한 내용은 컴포넌트 import 및 export를 참고하세요!)

Step 2: Define the function함수 정의하기

With function Profile() { } you define a JavaScript function with the name Profile. function Profile() { }을 사용하면 Profile이라는 이름의 JavaScript 함수를 정의할 수 있습니다.

Pitfall | 함정

React components are regular JavaScript functions, but their names must start with a capital letter or they won’t work! React 컴포넌트는 일반 JavaScript 함수이지만, 이름은 대문자로 시작해야 하며 그렇지 않으면 작동하지 않습니다!

Extra Comment

꼭 그렇지는 않습니다! -@정재남

JSX 안에서는 반드시 대문자로 시작해야 하지만, 그밖의 상황에서는 무관합니다. 다양한 방법으로 컴포넌트 추가하기를 참고하세요.

Step 3: Add markup마크업 추가하기

The component returns an <img /> tag with src and alt attributes. <img /> is written like HTML, but it is actually JavaScript under the hood! This syntax is called JSX, and it lets you embed markup inside JavaScript. 이 컴포넌트는 srcalt 속성을 가진 <img /> 태그를 반환합니다. <img /> 는 HTML처럼 작성되었지만 실제로는 JavaScript입니다! 이 구문을 JSX라고 하며, JavaScript 안에 마크업을 삽입할 수 있습니다.

Return statements can be written all on one line, as in this component: 반환문은 이 컴포넌트에서처럼 한 줄에 모두 작성할 수 있습니다:

return <img src="https://i.imgur.com/MK3eW3As.jpg" alt="Katherine Johnson" />;

But if your markup isn’t all on the same line as the return keyword, you must wrap it in a pair of parentheses: 그러나 마크업이 모두 return 키워드와 같은 라인에 있지 않은 경우에는 다음과 같이 괄호로 묶어야 합니다:

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

Pitfall | 함정

Without parentheses, any code on the lines after return will be ignored! 괄호가 없으면 return 뒷 라인에 있는 모든 코드가 무시됩니다!

Using a component컴포넌트 사용하기

Now that you’ve defined your Profile component, you can nest it inside other components. For example, you can export a Gallery component that uses multiple Profile components: 이제 Profile 컴포넌트를 정의했으므로 다른 컴포넌트 안에 중첩할 수 있습니다. 예를 들어, 여러 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>
  );
}

What the browser sees브라우저에 표시되는 내용

Notice the difference in casing: 대소문자의 차이에 주목하세요:

  • <section> is lowercase, so React knows we refer to an HTML tag.
  • <Profile /> starts with a capital P, so React knows that we want to use our component called Profile.
  • <section> 은 소문자이므로 React는 HTML 태그를 가리킨다고 이해합니다.
  • <Profile /> 은 대문자 P 로 시작하므로 React는 Profile 이라는 컴포넌트를 사용하고자 한다고 이해합니다.

And Profile contains even more HTML: <img />. In the end, this is what the browser sees: 그리고 <Profile /> 은 더 많은 HTML <img />가 포함되어 있습니다. 결국 브라우저에 표시되는 내용은 다음과 같습니다:

<section>
<h1>Amazing scientists</h1>
<img src="https://i.imgur.com/MK3eW3As.jpg" alt="Katherine Johnson" />
<img src="https://i.imgur.com/MK3eW3As.jpg" alt="Katherine Johnson" />
<img src="https://i.imgur.com/MK3eW3As.jpg" alt="Katherine Johnson" />
</section>

Nesting and organizing components컴포넌트 중첩 및 구성

Components are regular JavaScript functions, so you can keep multiple components in the same file. This is convenient when components are relatively small or tightly related to each other. If this file gets crowded, you can always move Profile to a separate file. You will learn how to do this shortly on the page about imports. 컴포넌트는 일반 JavaScript 함수이므로 같은 파일에 여러 컴포넌트를 포함할 수 있습니다. 컴포넌트가 상대적으로 작거나 서로 밀접하게 관련되어 있을 때 편리합니다. 이 파일이 복잡해지면 언제든지 Profile 을 별도의 파일로 옮길 수 있습니다. 이 방법은 바로 다음 챕터인 컴포넌트 import 및 export 페이지에서 확인할 수 있습니다.

Because the Profile components are rendered inside Gallery—even several times!—we can say that Gallery is a parent component, rendering each Profile as a “child”. This is part of the magic of React: you can define a component once, and then use it in as many places and as many times as you like. Profile 컴포넌트는 Gallery 내에 렌더링되기 때문에(심지어 여러 번!), Gallery는 각 Profile 을 “자식”으로 렌더링하는 부모 컴포넌트라고 말할 수 있습니다. 컴포넌트를 한 번 정의한 다음 원하는 곳에 원하는 만큼 여러 번 사용할 수 있다는 점이 바로 React의 마법입니다.

Pitfall | 함정

Components can render other components, but you must never nest their definitions: 컴포넌트는 다른 컴포넌트를 렌더링할 수 있지만, 그 정의를 중첩해서는 안 됩니다:

export default function Gallery() {
// 🔴 Never define a component inside another component!
function Profile() {
// ...
}
// ...
}

The snippet above is very slow and causes bugs. Instead, define every component at the top level: 위의 스니펫은 매우 느리고 버그를 촉발합니다. 대신 최상위 레벨에서 모든 컴포넌트를 정의하세요:

export default function Gallery() {
// ...
}

// ✅ Declare components at the top level
function Profile() {
// ...
}

When a child component needs some data from a parent, pass it by props instead of nesting definitions. 자식 컴포넌트에 부모 컴포넌트의 일부 데이터가 필요한 경우, 정의를 중첩하는 대신 props로 전달하세요.

Deep Dive | 심층 탐구

Components all the way down컴포넌트의 모든 것

Your React application begins at a “root” component. Usually, it is created automatically when you start a new project. For example, if you use CodeSandbox or if you use the framework Next.js, the root component is defined in pages/index.js. In these examples, you’ve been exporting root components. React 애플리케이션은 “root” 컴포넌트에서 시작됩니다. 보통 새 프로젝트를 시작할 때 자동으로 생성됩니다. 예를 들어, CodeSandbox를 사용하는 경우 또는 Next.js 프레임워크를 사용하는 경우, root 컴포넌트는 pages/index.js에 정의됩니다. 이 예제에서는 root 컴포넌트를 내보내고 있습니다.

Most React apps use components all the way down. This means that you won’t only use components for reusable pieces like buttons, but also for larger pieces like sidebars, lists, and ultimately, complete pages! Components are a handy way to organize UI code and markup, even if some of them are only used once. 대부분의 React 앱은 모든 부분에서 컴포넌트를 사용합니다. 즉, 버튼과 같이 재사용 가능한 부분뿐만 아니라 사이드바, 목록, 그리고 궁극적으로 전체 페이지와 같은 더 큰 부분에도 컴포넌트를 사용하게 됩니다! 컴포넌트는 한 번만 사용되더라도 UI 코드와 마크업을 정리하는 편리한 방법입니다.

React-based frameworks take this a step further. Instead of using an empty HTML file and letting React “take over” managing the page with JavaScript, they also generate the HTML automatically from your React components. This allows your app to show some content before the JavaScript code loads. React 기반 프레임워크들은 이를 한 단계 더 발전시킵니다. 빈 HTML 파일을 사용하고 React가 JavaScript로 페이지 관리를 “대행”하도록 하는 대신, React 컴포넌트에서 HTML을 자동으로 생성하기 합니다. 이를 통해 JavaScript 코드가 로드되기 전에 앱에서 일부 콘텐츠를 표시할 수 있습니다.

Still, many websites only use React to add interactivity to existing HTML pages. They have many root components instead of a single one for the entire page. You can use as much—or as little—React as you need. 그렇지만 여전히 많은 웹사이트는 React를 약간의 상호작용을 추가하는 용도로만 사용합니다. 이러한 웹사이트에는 전체 페이지에 하나의 root 컴포넌트가 아닌 여러 개의 root 컴포넌트가 있습니다. 필요한 만큼 React를 많이 또는 적게 사용할 수 있습니다.

Recap요약

You’ve just gotten your first taste of React! Let’s recap some key points. 이제 막 React를 처음 사용해 보셨습니다! 몇 가지 핵심 사항을 요약해 보겠습니다.

  • React lets you create components, reusable UI elements for your app.

  • In a React app, every piece of UI is a component.

  • React components are regular JavaScript functions except:

    1. Their names always begin with a capital letter.
    2. They return JSX markup.
  • React를 사용하면 앱의 재사용 가능한 UI 요소인 컴포넌트를 만들 수 있습니다.
  • React 앱에서 모든 UI는 컴포넌트입니다.
  • React 컴포넌트는 다음 몇 가지를 제외하고는 일반적인 JavaScript 함수입니다:
    1. 컴포넌트의 이름은 항상 대문자로 시작합니다.
    2. JSX 마크업을 반환합니다.

Challenge 1 of 4: Export the component컴포넌트 내보내기

This sandbox doesn’t work because the root component is not exported: root 컴포넌트를 내보내지 않았기 때문에 이 샌드박스는 작동하지 않습니다:

function Profile() {
  return (
    <img
      src="https://i.imgur.com/lICfvbD.jpg"
      alt="Aklilu Lemma"
    />
  );
}

Try to fix it yourself before looking at the solution! 정답을 확인하기 전에 직접 해결해 보세요!