React JSX란?

0

JSX란 React 스크립트 안에서 일반적인 HTML의 형태의 문법을 사용할 수 있도록 자바스크립트를 확장한 문법으로, React 엘리먼트를 생성할 수 있고, 자바스크립트의 모든 기능이 포함되어 있습니다.

JSX 문법
const element = <h1>Hello, world!</h1>;

React는 본질적으로 렌더링 로직이 UI 로직과 연결되는데, 별도의 파일에 마크업과 로직을 넣어 기술을 인위적으로 분리하는 대신, 마크업과 로직을 모두 포함하는 컴포넌트 형태로 구성할 수 있습니다.

여기서 UI 로직이란, 이벤트가 처리되는 방식, 시간에 따라 state가 변하는 방식, 화면에 표시하기 위해 데이터가 준비되는 방식 등을 말하는데, React에서는 JSX가 필수가 아니지만 자바스크립트 코드 안에서 UI 관련 작업을 할 때 더 많은 도움이 될 수 있고, React에서 도움이 되는 에러 및 경고 메시지를 표시할 수 있게 해준다고 합니다.

JSX 표현식 포함하기

JSX에 변수 포함하기
const name = 'Josh Perez';
const element = <h1>Hello, {name}</h1>;

ReactDOM.render(
  element,
  document.getElementById('root')
);

위 코드는 name이라는 변수를 선언한 후 중괄호로 감싸 JSX 안에서 사용하는 예로, JSX의 중괄호 안에는 유효한 모든 자바스크립트 표현식을 넣을 수 있습니다. 즉, 2 + 2 또는 user.firstName, formatName(user) 등과 같은 문법은 모두 유효한 자바스크립트 표현식으로, JSX의 중괄호 안에서 사용할 수 있는 표현식입니다.

다음은 자바스크립트 함수 호출의 결과인 formatName(user)<h1> 엘리먼트에 포함하는 코드 예제입니다.

JSX에 함수의 결과 값 포함하기
function formatName(user) {
  return user.firstName + ' ' + user.lastName;
}

const user = {
  firstName: 'Harper',
  lastName: 'Perez'
};

const element = (
  <h1>
    Hello, {formatName(user)}!
  </h1>
);

ReactDOM.render(
  element,
  document.getElementById('root')
);

React 컴파일이 끝나면 JSX 표현식이 정규 자바스크립트 함수로 호출이 되고 자바스크립트 객체로 인식되는데, JSX는 if 구문 또는 for loop 안에서 사용하거나, 변수로 할당하거나, 인자로 받거나, 함수로부터 반환할 수 있습니다.

JSX 속성 정의와 자식 정의하기

속성 정의하기

JSX 문자열 속성 추가하기
const element = <a href="https://www.reactjs.org"> link </a>;

JSX는 위 코드와 같이 속성에 따옴표“”를 이용해 문자열 리터럴을 정의할 수 있는데, 다음과 같이 중괄호{}를 사용하여 속성에 자바스크립트 표현식을 삽입할 수도 있습니다.

JSX 속성에 자바스크립트 표현식 사용하기
const element = <img src={user.avatarUrl}></img>;

JSX의 속성에 자바스크립트 표현식을 삽입하는 경우에는 중괄호를 따옴표“”로 감싸면 안되는데, 홈페이지의 관련 문서에는 따옴표 또는 중괄호 중 하나만 사용해야 한다고 안내되어 있습니다.

참고로 속성을 사용할 때 JSX는 HTML보다는 자바스크립트에 가깝기 때문에 React DOM은 HTML 속성의 이름 대신 카멜케이스 프로퍼티 명명 규칙을 사용해야 합니다. 즉, classclassName으로, tabindextabIndex와 같이 자바스크립트의 메서드 형식으로 사용해야 한다는 뜻입니다.

자식 정의하기

비어있는 태그 닫기
const element = <img src={user.avatarUrl} />;

위 코드와 같이 JSX 문법에서는 태그가 비어있는 경우에 XML처럼 />를 이용해 닫아주어야 합니다. 만약 자식 요소가 있다면 다음 코드와 같이 자식을 포함시킬 수도 있습니다.

자식 태그 포함하기
const element = (
  <div>
    <h1>Hello!</h1>
    <h2>Good to see you here.</h2>
  </div>
);

JSX의 특징

주입 공격 방지

JSX에서 사용자 입력을 받아 코드에 삽입하는 것이 안전한 방법입니다. 기본적으로 React DOM은 JSX에 삽입된 모든 값을 렌더링하기 전에 이스케이프처리를 하기 때문에, 앱에서 명시적으로 작성되지 않은 내용은 삽입되지 않고, 모든 항목은 렌더링 되기 전에 문자열로 변환되는데, JSX는 이런 특징 덕분에 XSS 피싱과 같은 공격을 방지할 수 있습니다.

주입 공격을 방지할 수 있는 JSX 문법
const title = response.potentiallyMaliciousInput;
const element = <h1>{title}</h1>; // 안전한 코드

객체 표현

Babel은 JSX를 React.createElement() 호출로 컴파일하는데, 다음의 두 예제는 동일한 결과를 보여줍니다.

JSX 문법
const element = (
  <h1 className="greeting">
    Hello, world!
  </h1>
);
React 순수 문법
const element = React.createElement(
  'h1',
  {className: 'greeting'},
  'Hello, world!'
);

React.createElement()는 버그가 없는 코드를 작성하는데 도움이 되도록 몇 가지 검사를 수행하는데, 기본적으로 다음과 같은 객체를 생성합니다.

React.createElement()에서 생성하는 객체
const element = {
  type: 'h1',
  props: {
    className: 'greeting',
    children: 'Hello, world!'
  }
};

이렇게 생성된 객체는 “React 엘리먼트”라고 하는데, 화면의 UI를 나타내는 표현 객체라고 할 수 있습니다. React는 이 객체를 읽어서 DOM을 구성하고 최신 상태로 유지하는데 사용합니다.

답글 남기기