모던 리액트 Deep Dive - JSX

2025. 9. 30. 21:17·Study/모던 리액트 Deep Dive

⚡리액트 핵심 요소 깊게 살펴보기 - 2.1 JSX란?

  • javaScript XML의 줄임말로, 리액트(React)에서 주로 사용하는 JavaScript 확장 문법
  • JavaScript 코드 안에서 HTML 태그처럼 보이는 코드를 쓸 수 있게 해주는 문법

2.1.1 JSX의 정의

JSX는  JSXElement, JSXAttributes, JSXChildren, JSXStrings 4가지 컴포넌트로 구성되어 있음.

1. JSXElement

JSX를 구성하는 가장 기본요소, HTML의 요소와 비슷한 역할을 함
  • JSXOpeningElement : 일반적인 요소 
    • ex) < JSXElement JSXAttributes(optional)>
  • JSXClosingElement : JSXOpeningElement 가 종료되었음을 알리는 요소
    • ex) < JSXElement />
  • JSXSelfClosingElement : 요소가 시작되고 스스로 종료되는 형태
  • JSXFragment : 아무런 요소가 없는 형태로, </>는 불가능하나, <> </>는 가능함

🌚 JSXElementName

  • JSXElement의 요소이름으로 쓸수있는 것 

💡 JSXIdentifier

  • JSX 내부에서 사용할 수 있는 식별자를 의미
//가능
function Vaild1(){
	return<$></$>
}

//불가능
function Invaild1(){
	return <1></1>
}

💡 JSXNamespacedName

  • JSXIdentifier:JSXIdentifier의 조합, 즉 :을 통해 서로 다른 식별자를 이어주는 것도 하나의 식별자로 취급됨
  • :로 묶을 수 있는 것은 한개뿐이고, 두개 이상은 올바른 식별자로 취급되지 않음
function vaild(){
	return <foo:bar></foo:bar>
}

//불가능
function invaild(){
	return <foo:bar:baz></foo:bar:baz>
}

💡 JSXMemberExpression 

  • JSXIdentifier.JSXIdentifier의 조합, 즉 .을 통해 서로 다른 식별자를 이어주는 것도 하나의 식별자로 취급됨
  • .을 여러 개 이어서 하는 것이 가능하나, 단 JSXNamespacedName과 이어서 사용하는 것은 불가능함
function vaild1(){
	return <foo.bar></foo.bar>
}

function vaild2(){
	return <foo.bar:.baz></foo.bar.baz>	
}

//불가능
function invaild(){
	return <foo:bar.baz></foo:bar.baz>
}

2. JSXAttributes

JSXElement에 부여할 수 있는 속성을 의미
단순 속성을 의미하기 때문에, 필수값이 아니고, 존재하지 않아도 에러가 나지 않음

💡JSXSpreadAtrributes 

  • 자바스크립트의 전개 연산자와 동일한 역할을 함
    • {...AssignmentExpression} : AssignmentExpression는 모든 표현식이 존재할 수있으며, 조건문, 화살표 함수, 할당식 등등
  • JSXAttribute : 속성을 나타내는 키와 값으로 짝을 이루어서 표현함(Key는 JSXAttributeName,value는  JSXAttributeValue)
    • JSXAttributeName :  :를 이용해 키를 나타냄
fcuntion vaild1(){
	return <foo.bar foo:bar="baz"></foo.bar>
}
  • JSXAttributeValue : 속성의 키에 할당할 수 있는 값으로 큰따옴표로 구성된 문자열(" "), 작은따옴표로 구성된 문자열(' ')
function Child({attribute}){
	return <div>{attribute}</div>
}

export default function App(){
	return(
    	<div>
        	<Child attribute=<div>hello</div> />
        </div>
    )
}

3. JSXChildren

  • JSXElement의 부모와 자식관계 중 자식 값울 나타냄
  • JSXChild : 자식의 기본 단위이며, JSXChildren은 JSXChild 을 0개 이상 가질수 있음(없어도 상관없음)
  • JSXText : {, < , > ,} 을 제외한 문자열이며, 문자로 표현하고싶다면 아래와 동일하게 사용할 것
function vaild(){
	return <>{'{} <>'} </>
}
  • 아래 함수를 리액트에서 렌더링을 하면 "foo"라는 문자열이 출력
export default function App(){
	return <>{(() => 'foo')()</>
}

4. JSXStrings 

  • JSX에서도 JavaScript 이스케이프 규칙을 그대로 따름

2.1.2 JSX 예제

🌚유효한 JSX구조 

// 하나의 요소로 구성된 가장 단순한 형태
const ComponentA = <A>안녕하세요.</A>

// 자식이 없이 SelfClosingTag로 닫혀 있는 형태도 가능하다.
const ComponentB = <A />

// 옵션을 { }와 전개 연산자로 넣을 수 있다.
const ComponentC = <A {...{ required: true }} />

// 속성만 넣어도 가능하다.
const ComponentD = <A required />

// 속성과 속성을 넣을 수 있다.
const ComponentE = <A required={false} />

const ComponentF = (
	<A>
  		<B text="react" /> // 문자열은 큰따옴표 & 작은 따옴표 가능
    </A>
)

const ComponentG = (
	<A>
  		<B optionalChildren={<>안녕하세요</>} />
  /* 옵션의 값으로 JSXElement를 넣을 수 있다. */
  	</A>
)

const ComponentH = (
	<A>
  		안녕하세요
  		<B text="react" />
  	</A>
)

2.1.3 JSX는 어떻게 자바스크립트에서 변환될까?

  • 자바스크립트에서 JSX가 변환되는 방식을 알려면 리액트에서 JSX를 변환하는 @babel/plugin-transform-react-jsx 플러그인을 알아야 함

💡JSX 코드

// JSX 코드
  const ComponentA = <A required={true}>Hi</A>

  const ComponentB = <>Hi<>

  const ComponentC = (
    <div>
      <span>Hi<span>
    </div>
  )

💡JSX코드를 @babel/plugin-transform-react-jsx 플러그인으로 변환한 결과

/ JSX 코드를 @babel/plugin-transform-react-jsx로 변환한 결과
  'use strict'

  var ComponentA = React.createElement(
    A,
    {
      required: true
    },
    'Hi',
  )

  var ComponentB = React.createElement(React.Fragment, null, 'Hi')

  var ComponentC = React.createElement(
    'div',
    null,
    React.createElement('span', null, 'Hi'),
  )

💡JSX가 변환되는 특성을 활용

// props 여부에 따라 children 요소만 달라지는 경우
// 굳이 번거롭게 전체 내용을 삼항 연산자로 처리할 필요가 없다.
// 이 경우 불필요한 코드 중복이 일어난다.
import {createElement, PropsWithChildren} from 'react'

function TextOrHeading({
isHeading,
children,
}: PropsWithChildren) {
return isHeading ? (
  <h1 className="text">{children}</h1>
  ) : (
    <span>{children}</span>
  )
}

// JSX가 변환되는 특성을 활용한다면 다음과 같이 간결하게 처리 할 수 있다.
import {createElement} from 'react'

function TextOrHeading({
isHeading,
children
}: PropsWithChildren<{ isHeading: boolean}>) {
return createElement(
  isHeading ? 'h1' : 'span',
  { className: 'text' },
  children,
 )
}
  • JSX 반환값이 결국 React.createElement로 귀결된다는 사실을 파악한다면 이런 식으로 쉽게 리팩토링 할 수 있음

 

'Study > 모던 리액트 Deep Dive' 카테고리의 다른 글

모던 리액트 Deep Dive - 컴포넌트  (0) 2025.10.07
모던 리액트 Deep Dive - 가상 DOM과 리액트 파이버  (0) 2025.09.30
모던 리액트 Deep Dive - 타입 스크립트  (1) 2025.09.23
모던 리액트 Deep Dive - 자주 사용되는 자바스크립트 문법  (0) 2025.09.23
모던 리액트 Deep Dive - 이벤트 루프와 비동기 통신의 이해  (0) 2025.09.23
'Study/모던 리액트 Deep Dive' 카테고리의 다른 글
  • 모던 리액트 Deep Dive - 컴포넌트
  • 모던 리액트 Deep Dive - 가상 DOM과 리액트 파이버
  • 모던 리액트 Deep Dive - 타입 스크립트
  • 모던 리액트 Deep Dive - 자주 사용되는 자바스크립트 문법
happy_dev
happy_dev
복사하고 붙여넣기 잘하고 싶어요
  • happy_dev
    happy의 개발일지
    happy_dev
  • 전체
    오늘
    어제
    • 전체 (43)
      • Java (0)
      • React (1)
      • DB (1)
      • Study (41)
        • 친절한 SQL 튜닝 (9)
        • 모던 리액트 Deep Dive (18)
        • 젠킨스로 배우는 CI,CD 파이프라인 구축 (14)
        • Studyd (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    oracle
    Jenkins
    SQL
    DB
    toad
    젠킨스
    리액트
    인덱스의기본
    조인
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
happy_dev
모던 리액트 Deep Dive - JSX
상단으로

티스토리툴바