v19.2Latest

빠른 시작

React 문서에 오신 것을 환영합니다! 이 페이지에서는 일상적으로 사용하게 될 React 개념의 80%를 소개합니다.

배울 내용
  • 컴포넌트를 생성하고 중첩하는 방법
  • 마크업과 스타일을 추가하는 방법
  • 데이터를 표시하는 방법
  • 조건부 렌더링과 목록을 렌더링하는 방법
  • 이벤트에 응답하고 화면을 업데이트하는 방법
  • 컴포넌트 간에 데이터를 공유하는 방법

컴포넌트 생성 및 중첩

React 앱은 컴포넌트로 구성됩니다. 컴포넌트는 고유한 로직과 외관을 가진 UI(사용자 인터페이스)의 일부입니다. 컴포넌트는 버튼처럼 작을 수도 있고, 전체 페이지처럼 클 수도 있습니다.

React 컴포넌트는 마크업을 반환하는 JavaScript 함수입니다:

이제 MyButton을 선언했으므로 다른 컴포넌트 안에 중첩할 수 있습니다:

참고로 <MyButton />는 대문자로 시작합니다. 이것이 React 컴포넌트임을 알 수 있는 방법입니다. React 컴포넌트 이름은 항상 대문자로 시작해야 하며, HTML 태그는 소문자여야 합니다.

결과를 확인해 보세요:

키워드export default는 파일의 주요 컴포넌트를 지정합니다. JavaScript 구문 중 익숙하지 않은 부분이 있다면,MDNjavascript.info에 훌륭한 참고 자료가 있습니다.

JSX로 마크업 작성하기

위에서 본 마크업 구문은 JSX라고 합니다. 선택 사항이지만, 대부분의 React 프로젝트는 편의성을 위해 JSX를 사용합니다.로컬 개발을 위해 권장하는 모든 도구는 JSX를 기본적으로 지원합니다.

JSX는 HTML보다 엄격합니다.<br />와 같은 태그를 닫아야 합니다. 또한 컴포넌트는 여러 JSX 태그를 반환할 수 없습니다.<div>...</div>나 빈 <>...</>래퍼와 같은 공통 부모로 감싸야 합니다:

JSX로 변환할 HTML이 많다면온라인 변환기를 사용할 수 있습니다.

스타일 추가하기

React에서는 CSS 클래스를className으로 지정합니다. 이는 HTML의class속성과 동일하게 작동합니다:

그런 다음 별도의 CSS 파일에 해당 CSS 규칙을 작성합니다:

React는 CSS 파일을 추가하는 방법을 규정하지 않습니다. 가장 간단한 경우, HTML에<link>태그를 추가합니다. 빌드 도구나 프레임워크를 사용하는 경우, 해당 문서를 참조하여 프로젝트에 CSS 파일을 추가하는 방법을 알아보세요.

데이터 표시하기

JSX를 사용하면 마크업을 JavaScript 안에 넣을 수 있습니다. 중괄호를 사용하면 JavaScript로 "탈출"하여 코드의 일부 변수를 포함시켜 사용자에게 표시할 수 있습니다. 예를 들어, 다음은user.name을 표시합니다:

JSX 속성에서도 JavaScript로 "탈출"할 수 있지만, 따옴표대신중괄호를 사용해야 합니다. 예를 들어,className="avatar"는 문자열"avatar"을 CSS 클래스로 전달하지만,src={user.imageUrl}는 JavaScript 변수user.imageUrl의 값을 읽은 다음 그 값을 src속성으로 전달합니다:

JSX 중괄호 안에는 더 복잡한 표현식도 넣을 수 있습니다. 예를 들어,문자열 연결:

위 예시에서 style={{}}는 특별한 문법이 아니라,{} 객체를 style={ }JSX 중괄호 안에 넣은 것입니다. 스타일이 JavaScript 변수에 의존할 때style 속성을 사용할 수 있습니다.

조건부 렌더링

React에는 조건을 작성하기 위한 특별한 문법이 없습니다. 대신 일반 JavaScript 코드를 작성할 때 사용하는 것과 동일한 기술을 사용하게 됩니다. 예를 들어, 조건부로 JSX를 포함시키기 위해if문을 사용할 수 있습니다:

더 간결한 코드를 선호한다면,조건부 ? 연산자를 사용할 수 있습니다.if와 달리 JSX 내부에서 작동합니다:

else 분기가 필요하지 않을 때는 더 짧은논리 && 구문을 사용할 수도 있습니다:

이러한 모든 접근 방식은 속성을 조건부로 지정할 때도 작동합니다. 이 JavaScript 구문 중 일부가 익숙하지 않다면, 항상if...else를 사용하는 것으로 시작할 수 있습니다.

목록 렌더링

컴포넌트 목록을 렌더링하려면for 루프배열 map() 함수와 같은 JavaScript 기능에 의존하게 됩니다.

예를 들어, 제품 배열이 있다고 가정해 보겠습니다:

컴포넌트 내부에서 map() 함수를 사용하여 제품 배열을 <li>항목 배열로 변환합니다:

<li>key속성이 있는 것을 확인하세요. 목록의 각 항목에 대해, 해당 항목을 형제 항목 중에서 고유하게 식별하는 문자열이나 숫자를 전달해야 합니다. 일반적으로 키는 데이터베이스 ID와 같이 데이터에서 가져와야 합니다. React는 나중에 항목을 삽입, 삭제 또는 재정렬할 때 어떤 일이 발생했는지 알기 위해 키를 사용합니다.

이벤트에 응답하기

컴포넌트 내부에 이벤트 핸들러함수를 선언하여 이벤트에 응답할 수 있습니다:

주의: onClick={handleClick}끝에 괄호가 없습니다! 이벤트 핸들러 함수를호출하지 마세요: 단지 전달만 하면 됩니다. React는 사용자가 버튼을 클릭할 때 이벤트 핸들러를 호출합니다.

화면 업데이트하기

종종 컴포넌트가 일부 정보를 "기억"하고 표시하길 원할 것입니다. 예를 들어, 버튼이 클릭된 횟수를 세고 싶을 수 있습니다. 이를 위해 컴포넌트에상태를 추가하세요.

먼저, React에서useState를 가져옵니다:

이제 컴포넌트 내부에상태 변수를 선언할 수 있습니다:

여러분은 useState로부터 두 가지를 얻습니다: 현재 상태(count)와 그것을 업데이트할 수 있는 함수(setCount)입니다. 원하는 이름을 지을 수 있지만, 관례적으로[something, setSomething]과 같이 작성합니다.

버튼이 처음 표시될 때,count0이 될 것입니다. 왜냐하면 여러분이0useState()에 전달했기 때문입니다. 상태를 변경하고 싶을 때는setCount()를 호출하고 새로운 값을 전달하세요. 이 버튼을 클릭하면 카운터가 증가합니다:

React는 여러분의 컴포넌트 함수를 다시 호출할 것입니다. 이번에는count1이 될 것입니다. 그다음에는2가 될 것입니다. 이런 식으로 계속됩니다.

동일한 컴포넌트를 여러 번 렌더링하면, 각각은 자신만의 상태를 갖게 됩니다. 각 버튼을 따로 클릭해 보세요:

각 버튼이 자신만의 count상태를 “기억”하고 다른 버튼에 영향을 주지 않는 것을 확인하세요.

Hook 사용하기

함수 이름이 use로 시작하는 함수를Hook이라고 합니다.useState는 React가 제공하는 내장 Hook입니다. 다른 내장 Hook은API 레퍼런스에서 찾을 수 있습니다. 또한 기존 Hook들을 조합하여 여러분만의 Hook을 작성할 수도 있습니다.

Hook은 다른 함수들보다 더 제한적입니다. Hook은 컴포넌트(또는 다른 Hook)의최상위에서만 호출할 수 있습니다. 조건문이나 반복문 안에서useState를 사용하려면, 새로운 컴포넌트를 추출하여 그 안에 배치하세요.

컴포넌트 간 데이터 공유하기

이전 예제에서 각MyButton은 독립적인 count를 가지고 있었고, 각 버튼을 클릭했을 때 클릭된 버튼의count만 변경되었습니다:

세 개의 컴포넌트로 이루어진 트리 다이어그램. 하나의 부모 컴포넌트는 MyApp으로 표시되고, 두 개의 자식 컴포넌트는 MyButton으로 표시됩니다. 두 MyButton 컴포넌트 모두 값이 0인 count를 포함하고 있습니다.세 개의 컴포넌트로 이루어진 트리 다이어그램. 하나의 부모 컴포넌트는 MyApp으로 표시되고, 두 개의 자식 컴포넌트는 MyButton으로 표시됩니다. 두 MyButton 컴포넌트 모두 값이 0인 count를 포함하고 있습니다.

처음에는 각MyButtoncount상태가0입니다.

이전 다이어그램과 동일한 다이어그램. 첫 번째 자식 MyButton 컴포넌트의 count가 강조되어 클릭을 나타내며 count 값이 1로 증가했습니다. 두 번째 MyButton 컴포넌트는 여전히 값 0을 포함하고 있습니다.이전 다이어그램과 동일한 다이어그램. 첫 번째 자식 MyButton 컴포넌트의 count가 강조되어 클릭을 나타내며 count 값이 1로 증가했습니다. 두 번째 MyButton 컴포넌트는 여전히 값 0을 포함하고 있습니다.

첫 번째MyButton이 자신의count1로 업데이트합니다.

그러나 종종 컴포넌트들이데이터를 공유하고 항상 함께 업데이트해야 할 필요가 있습니다.

MyButton컴포넌트가 동일한count를 표시하고 함께 업데이트하도록 만들려면, 상태를 개별 버튼들로부터 그들을 모두 포함하는 가장 가까운 컴포넌트로 “위로” 이동시켜야 합니다.

이 예제에서는 그것이MyApp입니다:

세 개의 컴포넌트 트리 다이어그램. 하나의 부모 컴포넌트는 MyApp으로 표시되고 두 개의 자식 컴포넌트는 MyButton으로 표시됩니다. MyApp에는 0의 count 값이 포함되어 있으며, 이 값은 두 MyButton 컴포넌트로 전달되어 각각 0의 값을 표시합니다.세 개의 컴포넌트 트리 다이어그램. 하나의 부모 컴포넌트는 MyApp으로 표시되고 두 개의 자식 컴포넌트는 MyButton으로 표시됩니다. MyApp에는 0의 count 값이 포함되어 있으며, 이 값은 두 MyButton 컴포넌트로 전달되어 각각 0의 값을 표시합니다.

처음에 MyAppcount상태는0이며 두 자식 컴포넌트로 전달됩니다.

이전 다이어그램과 동일한 다이어그램. 부모 MyApp 컴포넌트의 count가 강조되어 클릭으로 값이 1로 증가했음을 나타냅니다. 두 자식 MyButton 컴포넌트로의 흐름도 강조되어 있으며, 각 자식의 count 값은 전달된 값을 나타내는 1로 설정되어 있습니다.이전 다이어그램과 동일한 다이어그램. 부모 MyApp 컴포넌트의 count가 강조되어 클릭으로 값이 1로 증가했음을 나타냅니다. 두 자식 MyButton 컴포넌트로의 흐름도 강조되어 있으며, 각 자식의 count 값은 전달된 값을 나타내는 1로 설정되어 있습니다.

클릭 시,MyAppcount상태를1로 업데이트하고 두 자식 컴포넌트로 전달합니다.

이제 버튼 중 하나를 클릭하면MyAppcount가 변경되고, 이는 MyButton의 두 카운트 모두를 변경합니다. 이를 코드로 표현하는 방법은 다음과 같습니다.

먼저,상태를 위로 올리세요. MyButton에서MyApp으로 상태를 이동합니다:

그런 다음,상태를 아래로 전달하세요. MyApp에서 각MyButton으로 상태를 공유 클릭 핸들러와 함께 전달합니다.MyButton에 정보를 전달하려면 JSX 중괄호를 사용하면 되며, 이전에<img>와 같은 내장 태그에 했던 것과 같습니다:

이렇게 전달하는 정보를 props라고 합니다. 이제MyApp 컴포넌트는 count 상태와 handleClick이벤트 핸들러를 포함하며,둘 다 props로 각 버튼에 전달합니다.

마지막으로,MyButton을 변경하여 부모 컴포넌트에서 전달된 props를읽도록 합니다:

버튼을 클릭하면 onClick핸들러가 실행됩니다. 각 버튼의onClick prop은 MyApp 내부의 handleClick함수로 설정되었으므로 그 안의 코드가 실행됩니다. 해당 코드는setCount(count + 1)를 호출하여count상태 변수를 증가시킵니다. 새로운count값은 각 버튼에 prop으로 전달되어 모두 새로운 값을 표시합니다. 이를 "상태 끌어올리기"라고 합니다. 상태를 위로 올려 컴포넌트 간에 공유한 것입니다.

다음 단계

지금까지 React 코드 작성의 기본을 배웠습니다!

이를 실습에 적용하고 첫 번째 React 미니 앱을 만들려면튜토리얼을 확인하세요.