React5분
JSX
2024년 11월 16일
💡 JSX 완전 정복
📝 JSX란?
JSX(JavaScript XML) 는 JavaScript에 XML/HTML을 결합한 문법 확장임
React에서 UI를 표현하기 위해 사용하는 문법으로, XML처럼 보이지만 실제로는 JavaScript이다.
javascriptjsx
복사편집
const element = <h1>Hello, world!</h1>;
위 코드는 브라우저에서 실행되기 전 다음과 같은 JavaScript 코드로 변환됨
plainjs 복사편집 const element = React.createElement('h1', null, 'Hello, world!');
✅ 따라서 브라우저는 JSX를 직접 이해하지 못하고, Babel 등의 트랜스파일러가 JSX를 JavaScript로 변환해줌.
🔍 왜 JSX를 사용할까?
이유 | 설명 |
---|---|
선언적 UI | UI를 마치 HTML처럼 명확하게 선언할 수 있음 |
가독성 향상 | JS 안에 HTML을 작성하듯이 가독성이 매우 좋음 |
컴포넌트 기반 | 함수형 컴포넌트에 적합한 구조 |
코드 간결화 | React.createElement() 를 직접 쓰지 않아도 됨 |
🧩 JSX 문법 상세
1. HTML처럼 보이지만 JavaScript이다
javascriptjsx
복사편집
const title = <h1>Welcome</h1>;
<h1>
은 실제 HTML이 아니라React.createElement()
로 변환되는 함수 호출이다.
2. 태그는 반드시 닫아야 한다
JSX에서는 모든 태그가 닫혀 있어야 함:
javascriptjsx
복사편집
// ❌ 오류
const img = <img src="logo.png">
// ✅ 올바른 사용
const img = <img src="logo.png" />;
3. 하나의 부모 태그로 감싸야 한다
javascriptjsx
복사편집
// ❌ 오류
return (
<h1>안녕</h1>
<p>반가워</p>
);
// ✅ 올바른 사용
return (
<div>
<h1>안녕</h1>
<p>반가워</p>
</div>
);
또는 Fragment(<> </>
) 사용 가능:
javascriptjsx
복사편집
return (
<><h1>안녕</h1>
<p>반가워</p>
</>
);
4. JavaScript 표현식은 {}
안에
javascriptjsx
복사편집
const name = "Mokoko";
const greeting = <h1>Hello, {name}</h1>;
{}
안에서는 JS 표현식, 변수, 함수 호출 등 모두 가능- if문처럼 문(statement)은 사용할 수 없음 → 조건부 렌더링은 삼항 연산자 사용
javascriptjsx
복사편집
{isLoggedIn ? <Logout /> : <Login />}
5. 속성은 카멜케이스로
JSX에서 HTML 속성은 카멜 케이스(CamelCase) 로 작성해야 한다.
HTML | JSX |
---|---|
class | className |
for | htmlFor |
onclick | onClick |
javascriptjsx
복사편집
<button className="btn" onClick={handleClick}>
클릭
</button>
6. JavaScript 코드와 HTML의 혼합
JSX는 JavaScript 문법 안에서 HTML 요소를 작성할 수 있다.
javascriptjsx
복사편집
const user = { name: "Mokoko", age: 24 };
const profile = (
<div>
<h2>{user.name}</h2>
<p>{user.age}세</p>
</div>
);
7. 조건부 렌더링
javascriptjsx
복사편집
{isLoggedIn && <p>환영합니다!</p>}
javascriptjsx
복사편집
{isDarkMode ? <DarkTheme /> : <LightTheme />}
8. 리스트 렌더링
javascriptjsx
복사편집
const items = ['사과', '바나나', '포도'];
const list = (
<ul>
{items.map((item, idx) => (
<li key={idx}>{item}</li>
))}
</ul>
);
✅ key는 리스트 항목에 고유한 식별자로 반드시 부여
9. 함수형 컴포넌트에서의 JSX
javascriptjsx
복사편집
function Welcome(props) {
return <h1>안녕하세요, {props.name}님</h1>;
}
또는 화살표 함수:
javascriptjsx
복사편집
const Welcome = ({ name }) => <h1>안녕하세요, {name}님</h1>;
10. Babel이 어떻게 변환하는지 예시
javascriptjsx
복사편집
const element = <h1 className="title">Hello</h1>;
⬇️ Babel에 의해 다음으로 변환됨
plainjs 복사편집 const element = React.createElement( 'h1', { className: 'title' }, 'Hello' );
✅ JSX 핵심 요약
항목 | 설명 |
---|---|
정의 | JavaScript + XML 문법 확장 |
사용 이유 | 가독성, 선언형 UI, 코드 간결화 |
브라우저 | 직접 해석 ❌ → Babel이 JS로 변환 |
특징 | 태그 닫기 필수, 1개의 부모 필요, 카멜케이스 속성 |
JSX 내 표현 | {} 안에서 JS 사용 |
조건문 | ? , && 연산자 사용 |
반복 렌더링 | .map() 사용 + key 필수 |
트랜스파일러 | Babel 사용 (JSX → JS) |
태그
#React