JSX는 JavaScript 안에서 UI 구조를 표현할 수 있는 문법 확장입니다. HTML과 비슷하게 보이지만 문자열이나 HTML 파일 자체는 아닙니다. 빌드 도구가 JavaScript 호출 형태로 변환한 뒤 실행합니다.

JavaScript와 마크업을 함께 표현하기

export default function Greeting() {
  const name = "성근";

  return (
    <section className="greeting">
      <h2>{name}님, 안녕하세요.</h2>
      <p>오늘도 하나씩 기록합니다.</p>
    </section>
  );
}

중괄호 {} 안에는 JavaScript 표현식을 넣습니다. 변수, 함수 호출, 삼항 연산자 등을 사용할 수 있지만 if문 자체를 넣을 수는 없습니다. 조건문이 필요하면 JSX 바깥에서 처리하거나 표현식으로 작성합니다.

HTML과 다른 규칙

항목 JSX 규칙
여러 요소 반환 부모 요소 또는 Fragment <>...</>로 묶기
태그 닫기 <img />, <input />처럼 빈 태그도 닫기
클래스 지정 className 사용
레이블 연결 htmlFor 사용
이벤트 onClick 등에 함수 전달
스타일 style에 JavaScript 객체 전달

aria-*data-* 속성은 HTML처럼 하이픈 표기를 유지합니다. 사용자 정의 컴포넌트 이름은 대문자로 시작하여 기본 HTML 태그와 구분합니다.

목록과 조건부 표시

export default function TopicList() {
  const topics = [
    { id: "js", name: "JavaScript" },
    { id: "cs", name: "컴퓨터 과학" },
  ];

  return (
    <ul>
      {topics.map(topic => (
        <li key={topic.id}>{topic.name}</li>
      ))}
    </ul>
  );
}

이 컴포넌트를 표시하면 두 항목이 나와야 합니다. key에는 형제 항목 사이에서 고유하고 안정적인 식별자를 사용합니다. 변경될 수 있는 목록에서 배열 인덱스를 식별자로 쓰면 항목의 상태가 잘못 연결될 수 있습니다.

JSX가 바로 DOM은 아니다

JSX는 화면에 무엇이 있어야 하는지 설명합니다. React는 그 결과를 사용해 실제 DOM을 갱신합니다. JSX 없이도 React를 사용할 수 있으며, JSX를 사용한다는 이유만으로 브라우저가 그 문법을 직접 실행하는 것은 아닙니다.

참고