누구나 로고
オンライン講座企業・団体研修ライブラリトレンドインサイト無料コースお知らせお問い合わせ採用サイト

カスタマーサポート

  • お知らせ
  • よくある質問
  • footer.contact
  • コミュニティ

ご利用案内

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

サービス

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

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

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

© 2026 NUGUNA. All rights reserved.

KB예금주인증
ホームコースライブラリお問い合わせMY
관리자
모든 강의를 무료로 볼 수 있어요. 회원가입 없이도 학습 가능합니다.
로그인무료 회원가입
강좌리액트 입문 — 컴포넌트로 만드는 웹3강

3강 / 전체 8강

JSX 기초

4분 읽기 조회 56

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강 컴포넌트 만들기
1.리액트란 무엇인가
2.개발 환경 만들기 — Vite
3.JSX 기초
4.컴포넌트 만들기
5.Props로 데이터 전달
6.State와 useState
7.이벤트 처리
8.조건부 렌더링