JSX
순수 JavaScript로 UI를 만들려면 여러 단계를 거쳐야 합니다. 요소를 생성하고, 클래스를 지정하고, 텍스트를 설정한 다음, 페이지에 붙이는 식입니다. 마크업과 그것을 동작시키는 코드가 떨어져 있어서, UI가 커질수록 둘을 동기화하기 어려워집니다. **JSX**는 이 간격을 좁혀줍니다. 마크업이 JavaScript 안에 직접 들어가서, 템플릿과 스크립트를 따로 관리하는 대신 자유롭게 섞어서 사용할 수 있습니다.
JavaScript 안의 마크업
JSX는 JavaScript이므로, 중괄호 {}로 감싸면 어떤 JavaScript 표현식이든 넣을 수 있습니다. 변수든, 함수 호출이든, 계산이든, 필요한 어떤 값이든 정적인 텍스트를 쓰는 자리에 그대로 마크업에 들어갑니다.
const name = 'Ada'
return <p className="greeting">Hello, {name}</p>여기서 {name}은 렌더링될 때 name 변수의 값으로 바뀌므로, 페이지에는 "Hello, Ada"가 표시됩니다. 중괄호 바깥은 모두 마크업이고, 안은 순수 JavaScript입니다.
JSX에는 몇 가지 규칙이 있습니다. 대부분의 속성은 HTML이 사용하는 소문자와 하이픈 형태 대신 camelCase를 사용하므로, class, for, tabindex 대신 className, htmlFor, tabIndex입니다. 다만 ARIA와 data- 속성은 하이픈을 유지해서 aria-hidden과 data-testid 같이 씁니다. 모든 태그는 닫아야 하는데, HTML에서는 열어만 두는 태그도 포함해서 <img />와 <br />처럼 닫는 슬래시가 필요합니다. 그리고 컴포넌트는 하나의 루트 요소만 반환할 수 있습니다. 추가 <div>로 감싸지 않고 두 개의 형제 요소를 반환해야 한다면, 빈 꺾쇠괄호로 된 fragment로 감싸면 됩니다.
return (
<>
<h1>Title</h1>
<p>Some text</p>
</>
)JSX와 HTML의 차이점
JSX는 HTML과 충분히 닮아 있어서 차이점을 놓치기 쉬운데, 문제가 될 때까지 눈에 띄지 않습니다. 가장 먼저 눈에 띄는 것은 속성 이름입니다. class는 className이 되는데, class는 JavaScript의 예약어이기 때문입니다. style 속성도 다릅니다. HTML에서는 CSS 문자열이지만, JSX에서는 JavaScript 객체이며, 속성 이름은 camelCase이고 값은 문자열입니다.
<div style={{ backgroundColor: 'lightblue', fontSize: '18px' }}>Styled</div>바깥쪽 {}는 표현식을 포함하는 같은 것이고, 안쪽 {}는 포함되는 객체 리터럴이라서, JSX의 style 속성은 중괄호가 연달아 두 개 나타나게 됩니다.
다른 차이점은 {} 안에 뭘 넣을 수 있느냐입니다. **표현식**만 허용되는데, 이는 값을 산출하는 것들 — 변수, 함수 호출, 삼항 연산자 같은 것입니다. 문(statement)은 허용되지 않으므로, if나 for 루프를 마크업의 중괄호 안에 직접 넣을 수 없습니다. 그런 종류의 로직이 필요할 때는 return 위에서 실행하고 결과를 포함시키면 됩니다.
내부적으로 JSX는 브라우저에 도달하기 전에 순수 JavaScript 함수 호출로 컴파일됩니다. 이는 매일 생각할 문제보다는 도구 관련 세부 사항이고, Beyond the basics 장에서 React의 나머지 부분이 준비되면 다시 다룹니다.
{}는 마크업 안에서 JavaScript로 돌아가는 입구입니다. 중괄호 사이의 모든 것은 값이고, 변수고, 계산이고, 함수 호출이며, 페이지에 바로 떨어집니다. 나머지는 모두 여기서 따라옵니다. class 대신 className, 모든 태그를 닫기, 그리고 반환마다 하나의 루트 요소입니다. 다음: 컴포넌트 스타일링에서 요소들의 모양을 살펴봅시다.

