Skip to content
This page has been auto-translated and may contain errors.View in English

컴포넌트

어떤 페이지에 같은 인사말 카드를 세 곳에 배치해야 하는데, 각각 같은 제목과 레이아웃을 가져야 한다고 해봅시다. 마크업을 세 번 복사하면 디자인이 바뀔 때마다 세 곳 모두 수정해야 합니다. React의 해결책은 그 UI 조각을 한 번 작성한 다음 **컴포넌트**로 재사용하는 것입니다. 컴포넌트는 JSX를 반환하는 JavaScript 함수인데, JSX는 UI의 한 부분을 설명한 것입니다. HTML 태그처럼 작성해서 사용하면 React가 함수를 호출해서 화면에 무엇을 표시할지 결정합니다.

가장 간단한 예시입니다:

jsx
function Greeting() {
  return <h1>Hello</h1>
}

Greeting<h1>Hello</h1>을 반환하는 함수입니다. 실제로 보여주려면 다른 컴포넌트 안에서 태그처럼 사용해서 렌더링해야 합니다:

jsx
function App() {
  return (
    <div>
      <Greeting />
      <Greeting />
    </div>
  )
}

App도 컴포넌트입니다. div 안에 Greeting 컴포넌트 두 개를 렌더링하고, 각각 자신의 <h1>Hello</h1>을 출력합니다. 이것이 조합(composition)입니다. 작은 컴포넌트들을 만들고 이들을 조합해서 더 큰 컴포넌트를 만들고, 이렇게 계속 쌓아 올려 전체 앱을 완성합니다.

이 과정에서 지켜야 할 몇 가지 규칙이 있습니다. 컴포넌트 이름은 대문자로 시작해야 합니다. GreetingApp이 태그로 작동하는 이유는 React가 이들을 divh1처럼 소문자로 시작하는 일반 HTML 요소들과 구분할 수 있기 때문입니다. JSX를 반환하는 컴포넌트는 반드시 하나의 루트 요소를 반환해야 합니다. App이 두 개의 Greeting 태그를 하나의 div로 감싸는 것처럼 말입니다. 이 부분은 처음 배우는 사람들이 거의 모두 실수합니다. 형제 요소 여러 개를 감싸지 않고 반환하면 React가 오류를 던집니다. 형제 요소들을 추가 div 없이 반환해야 한다면 Fragment를 사용하세요:

jsx
function Greeting() {
  return (
    <>
      <h1>Hello</h1>
      <p>Welcome back</p>
    </>
  )
}

<></>가 Fragment입니다. 페이지에 요소를 추가하지 않으면서 h1p를 하나의 반환값으로 묶어줍니다.

버전 참고

이전 React 코드는 종종 함수 대신 클래스로 컴포넌트를 정의했습니다:

jsx
class Greeting extends React.Component {
  render() {
    return <h1>Hello</h1>
  }
}

기존 코드베이스에서는 여전히 이런 클래스 컴포넌트를 볼 수 있습니다. 이 핸드북은 전체적으로 함수 컴포넌트를 사용합니다. 이것이 현재의 표준적인 React 작성 방식입니다. React가 한 스타일에서 다른 스타일로 어떻게 발전했는지는 역사와 버전을 참고하세요.

컴포넌트는 렌더링 중에 호출되므로 함수 본문을 순수하게 계산만 하는 장소로 생각하고 부수 효과를 제외해야 합니다. 같은 props를 받으면 컴포넌트는 매번 같은 JSX를 반환해야 합니다. 데이터를 가져오거나, 타이머를 설정하거나, 함수 외부의 변수를 직접 변경하지 마세요. 이런 작업들은 나중에 배우게 될 useEffect 같은 Hook에 속합니다. (Effects 섹션을 참고하세요.) Hook은 렌더링 중이 아니라 렌더링이 끝난 후에 코드를 실행합니다. DOM을 읽거나, 컴포넌트 외부에 선언된 변수에 쓰거나, 호출 사이에 변하는 값에 의존하는 것은 모두 이 규칙을 위반하며, React가 제어 범위 밖의 이유로 컴포넌트를 여러 번 호출할 수 있기 때문에 추적하기 어려운 버그를 만듭니다.

Juno컴포넌트는 함수입니다 핵심 아이디어는 한 문장으로 설명됩니다: 컴포넌트는 함수이고, <Greeting /> 같은 태그로 호출하면 그 함수가 실행되고 반환된 내용이 표시됩니다. 이것만 이해하면 React의 나머지는 이 함수들 안에 무엇을 넣을 수 있는지 배우는 것입니다.
Juno컴포넌트는 함수입니다 컴포넌트는 React에서 무언가를 만들기 위한 기본 단위입니다. 컴포넌트를 작게 유지하고, 대문자로 이름을 지으며, 하나의 루트를 반환하세요. 형제 요소들을 감싸야 할 때는 추가 래퍼 요소 없이 Fragment를 사용하세요. 조합(composition), 즉 작은 컴포넌트들을 조합해서 더 큰 컴포넌트를 만드는 방식이 모든 실제 화면을 구축하는 방법입니다.
Juno컴포넌트는 함수입니다 컴포넌트는 props의 순수 함수입니다: 같은 입력이면 같은 JSX가 나가고, 함수 본문에 부수 효과가 없습니다. 이 제약 덕분에 React가 컴포넌트를 자유롭게 호출하고, 렌더를 일괄 처리하고, 작업을 재정렬해도 아무것도 깨지지 않습니다. 부수 효과는 이유가 있어서 자신의 Hook을 가지고 있습니다.

다음은 JSX입니다. 이 return 문 안에서 본 문법을 자세히 알아봅시다.