누구나 로고
オンライン講座企業・団体研修ライブラリトレンドインサイト無料コースお知らせお問い合わせ採用サイト
모든 강의를 무료로 볼 수 있어요. 회원가입 없이도 학습 가능합니다.
로그인무료 회원가입
강좌리액트 입문 — 컴포넌트로 만드는 웹3강

3강 / 전체 28강

JSX 기초

4분 읽기 조회 65

JSX가 무엇인지, 어떻게 동작하는지, 표현식 삽입과 className, Fragment 등 핵심 문법을 실제 코드로 깊이 이해합니다.

📌 JSX는 HTML이 아니다

처음 리액트를 보면 JS 코드 안에 HTML처럼 생긴 것이 있어서 당황스럽습니다. 이것을 JSX(JavaScript XML)라고 합니다. JSX는 HTML과 비슷하게 생겼지만, 실제로는 JavaScript입니다. 브라우저는 JSX를 직접 이해하지 못합니다 — Babel 같은 도구가 JSX를 순수 JS 함수 호출로 변환해줍니다.

// 우리가 쓰는 JSX
const element = <h1 className="title">안녕하세요</h1>

// Babel이 변환한 실제 JS
const element = React.createElement('h1', { className: 'title' }, '안녕하세요')

이 변환 과정을 이해하면 왜 JSX가 특정 규칙을 따라야 하는지 명확해집니다.

🔢 표현식 삽입 — 중괄호 {}

JSX에서 중괄호 {} 안에는 모든 JavaScript 표현식을 넣을 수 있습니다. 표현식이란 값으로 평가되는 코드입니다.

const name = '김민준'
const age = 25
const isPremium = true

function Profile() {
  return (
    <div>
      {/* 변수 삽입 */}
      <p>이름: {name}</p>

      {/* 계산식 */}
      <p>내년 나이: {age + 1}세</p>

      {/* 삼항 연산자 */}
      <p>등급: {isPremium ? '프리미엄' : '일반'}</p>

      {/* 함수 호출 */}
      <p>대문자: {name.toUpperCase()}</p>
    </div>
  )
}

반면 if문, for문처럼 값으로 평가되지 않는 구문(statement)은 중괄호 안에 직접 넣을 수 없습니다. 대신 삼항 연산자나 함수 안에서 처리합니다.

🏷️ className — HTML과 다른 속성명

JSX는 HTML처럼 생겼지만 속성명이 다른 것들이 있습니다. 가장 중요한 차이는 class 대신 className을 쓴다는 것입니다. class는 JavaScript의 예약어이기 때문입니다.

HTMLJSX이유
class="btn"className="btn"class는 JS 예약어
for="input"htmlFor="input"for도 JS 예약어
onclick="fn()"onClick={fn}카멜케이스 + 함수 참조
tabindex="0"tabIndex={0}카멜케이스
style="color:red"style={{ color: 'red' }}객체 형태

📦 하나의 부모로 감싸기 규칙

JSX는 반드시 하나의 부모 요소를 반환해야 합니다. 이 규칙은 JSX가 React.createElement() 함수 호출로 변환되기 때문에 생기는 제약입니다 — 함수는 하나의 값만 반환할 수 있습니다.

// ❌ 오류 — 두 개의 요소가 최상위에 있음
function App() {
  return (
    <h1>제목</h1>
    <p>내용</p>
  )
}

// ✅ div로 감싸기
function App() {
  return (
    <div>
      <h1>제목</h1>
      <p>내용</p>
    </div>
  )
}

// ✅ Fragment로 감싸기 (불필요한 div 없이)
function App() {
  return (
    <>
      <h1>제목</h1>
      <p>내용</p>
    </>
  )
}

Fragment(<></>)는 실제 DOM 요소를 추가하지 않고 여러 요소를 묶어주는 리액트 특수 컴포넌트입니다. 불필요한 <div> 중첩을 피할 때 사용합니다.

🔚 자기 닫기 태그(Self-closing)

HTML에서는 <img>, <input> 등이 닫는 태그 없이 사용됩니다. JSX에서는 자식이 없는 모든 요소를 반드시 />로 닫아야 합니다.

// ❌ HTML처럼 쓰면 오류
<img src="photo.jpg">
<input type="text">

// ✅ JSX에서는 반드시 닫기
<img src="photo.jpg" />
<input type="text" />

💬 JSX 주석

JSX 안에서 주석을 쓰는 방법도 HTML과 다릅니다:

function Component() {
  return (
    <div>
      {/* JSX 안의 주석은 이렇게 씁니다 */}
      <p>내용</p>
      {/* 여러 줄도
          가능합니다 */}
    </div>
  )
}

✅ 정리

  • JSX는 JS 안에 HTML처럼 쓰는 문법이며, 빌드 시 React.createElement() 호출로 변환됩니다.
  • 중괄호 {}로 모든 JS 표현식을 삽입할 수 있습니다.
  • class 대신 className, 이벤트는 카멜케이스(onClick)로 씁니다.
  • 반드시 하나의 부모 요소(또는 Fragment)로 감싸야 합니다.
  • 자식이 없는 요소는 />로 닫습니다.

관련 주제

  • JSX 문법
  • React.createElement 변환
  • 표현식 삽입 중괄호
  • className
  • Fragment
  • 개발·프로그래밍
  • 개발·프로그래밍 강의
  • 리액트 입문 — 컴포넌트로 만드는 웹
  • 무료강의
  • 무료 온라인 강의
  • NUGUNA
  • 누구나
이전 2강개발 환경 만들기 — Vite다음 4강 컴포넌트 만들기

댓글

0/1000

불러오는 중...

목차

  1. 1.리액트란 무엇인가
  2. 2.개발 환경 만들기 — Vite
  3. 3.JSX 기초
  4. 4.컴포넌트 만들기
  5. 5.Props로 데이터 전달
  6. 6.State와 useState
  7. 7.이벤트 처리
  8. 8.조건부 렌더링
  9. 9.리스트 렌더링과 key
  10. 10.폼 다루기
  11. 11.useEffect 기초
  12. 12.데이터 가져오기(fetch)
  13. 13.상태 끌어올리기
  14. 14.컴포넌트 합성과 재사용
  15. 15.useRef와 DOM 접근
  16. 16.커스텀 훅 만들기
  17. 17.Context API
  18. 18.useReducer
  19. 19.리스트 앱 실전 ①
  20. 20.리스트 앱 실전 ②
  21. 21.라우팅 — React Router
  22. 22.스타일링 방법들
  23. 23.리스트·상세 페이지 연결
  24. 24.비동기 상태 관리 패턴
  25. 25.성능 기초 — memo
  26. 26.에러 처리와 경계
  27. 27.환경변수와 빌드
  28. 28.배포하기

カスタマーサポート

  • お知らせ
  • よくある質問
  • お問い合わせ
  • コミュニティ

ご利用案内

  • 利用規約
  • プライバシーポリシー
  • 返金ポリシー

サービス

  • 会社紹介
  • 新規登録
  • 新着コース
  • 無料コース
누구나 로고
利用規約プライバシーポリシー返金ポリシー

상호명: NUGUNA  |  대표자: 정우진  |  사업자등록번호: 392-32-01817  |  통신판매업신고: 제 2026-서울양천-0564 호

주소: 서울특별시 양천구 목동서로 100  |  이메일: nugunapass@gmail.com  |  전화: 010-6395-3043

© 2026 NUGUNA. All rights reserved.

KB예금주인증관리자
ホームコースライブラリお問い合わせMY