ToolDeck

HTML to JSX

HTML을 React JSX로 변환 — class→className, style 문자열→객체

예시 시도

HTML 입력

JSX 출력

로컬에서 실행 · 시크릿 붙여넣기 안전
JSX 출력이 여기에 표시됩니다…

HTML to JSX 변환이란 무엇인가요?

HTML to JSX 변환은 표준 HTML 마크업을 React 컴포넌트가 렌더링할 수 있는 JSX 문법으로 변환하는 과정입니다. JSX는 HTML과 유사하게 보이지만 JavaScript 명명 규칙과 규칙을 따릅니다. class와 같은 속성은 className이 되고, for는 htmlFor가 되며, 인라인 style 문자열은 JavaScript 객체로 교체됩니다. JSX는 React.createElement() 호출로 컴파일되기 때문에 이러한 변경이 필요합니다. 속성 이름은 HTML 속성 이름이 아닌 DOM API 속성 이름과 일치해야 합니다.

HTML 속성과 JSX props 간의 매핑은 React의 DOM 요소 문서에 정의되어 있습니다. React는 다중 단어 속성에 camelCase를 사용합니다(tabindex는 tabIndex, maxlength는 maxLength). JavaScript 식별자에는 하이픈이 포함될 수 없기 때문입니다. <img>, <br>, <input>과 같은 자기 닫힘 태그는 JSX에서 끝에 슬래시를 포함해야 합니다(<img />). JSX는 모든 태그를 명시적으로 닫아야 하는 XML 규칙을 따르기 때문입니다.

htmlToJsxContent.whatBody3

HTML to JSX 변환기를 사용하는 이유

수십 개의 HTML 요소에서 속성을 수동으로 이름 변경하고 style 문자열을 재작성하는 것은 느리고 오류가 발생하기 쉽습니다. 변환기는 모든 변환을 한 번에 처리하므로 어떤 소스의 HTML이든 붙여넣기만 하면 몇 초 안에 유효한 JSX를 얻을 수 있습니다.

즉각적인 변환
HTML 코드 조각을 붙여넣으면 즉시 JSX 출력을 얻을 수 있습니다. 변환기는 class, for, style, 이벤트 핸들러, 불리언 속성, 자기 닫힘 태그를 한 번에 처리합니다.
🔒
개인 정보 우선 처리
모든 변환은 브라우저에서 로컬로 실행됩니다. HTML이 페이지 밖으로 전송되지 않으므로 내부 코드, API 엔드포인트, 민감한 콘텐츠가 포함된 마크업도 안전하게 변환할 수 있습니다.
📋
계정이나 설정 불필요
페이지를 열고 바로 변환을 시작하세요. 로그인이 필요 없고, npm 패키지를 설치할 필요도 없으며, 빌드 단계를 설정할 필요도 없습니다. 최신 브라우저가 있는 모든 기기에서 작동합니다.
🔧
완전한 속성 범위 지원
className, htmlFor, tabIndex, readOnly, autoComplete 등 20개 이상의 표준 HTML-to-JSX 속성 매핑을 모두 변환합니다. onclick을 onClick으로 변환하는 이벤트 핸들러 이름 변경도 처리합니다.

HTML to JSX 사용 사례

프론트엔드 개발자: 템플릿 마이그레이션
기존 HTML 페이지나 컴포넌트를 React 프로젝트로 옮길 때, 수백 줄에 걸쳐 class와 for 속성을 수동으로 찾는 대신 마크업을 변환기에 붙여넣으세요.
백엔드 개발자: HTML 이메일 임베딩
이메일 템플릿은 일반 HTML로 작성됩니다. React 관리자 대시보드나 미리보기 컴포넌트 안에서 렌더링할 때 HTML을 유효한 JSX로 변환하여 className과 style 문법 오류를 피하세요.
DevOps: 대시보드 위젯 변환
모니터링 대시보드는 종종 사용자 지정 위젯에 HTML 코드 조각을 사용합니다. Retool이나 사용자 정의 관리 패널 같은 React 기반 내부 도구 플랫폼에 통합할 때 이것들을 JSX로 변환하세요.
QA 엔지니어: 버그 리포트 재현
버그 리포트에 원시 HTML 출력이 포함된 경우, JSX로 변환하여 시각적 검사와 디버깅을 위해 React 테스트 환경이나 Storybook 스토리 안에서 빠르게 렌더링하세요.
디자이너: HTML 목업에서 프로토타이핑
Figma 같은 디자인 도구는 HTML/CSS를 내보냅니다. 내보낸 마크업을 JSX로 변환하여 수동으로 속성을 정리하지 않고 바로 React 프로토타입에 드롭하세요.
학생: React 문법 학습
HTML 입력과 JSX 출력을 나란히 비교하여 어떤 속성이 왜 바뀌는지 이해하세요. 변환 과정을 직접 보면 문서만 읽는 것보다 React 명명 규칙을 훨씬 쉽게 익힐 수 있습니다.

HTML to JSX 속성 매핑 참조

아래 표는 JSX로 변환할 때 바뀌는 HTML 속성을 나열합니다. 여기에 없는 속성(id, src, href, alt, placeholder 등)은 HTML 이름이 이미 해당 DOM API 속성 이름과 일치하므로 그대로 유지됩니다.

HTML 속성JSX Prop참고
classclassNameReserved word in JavaScript
forhtmlForReserved word in JavaScript
tabindextabIndexcamelCase convention
readonlyreadOnlycamelCase convention
maxlengthmaxLengthcamelCase convention
minlengthminLengthcamelCase convention
cellpaddingcellPaddingcamelCase convention
cellspacingcellSpacingcamelCase convention
rowspanrowSpancamelCase convention
colspancolSpancamelCase convention
enctypeencTypecamelCase convention
autocompleteautoCompletecamelCase convention
autofocusautoFocuscamelCase convention
autoplayautoPlaycamelCase convention
contenteditablecontentEditablecamelCase convention
crossorigincrossOrigincamelCase convention
novalidatenoValidatecamelCase convention
allowfullscreenallowFullScreencamelCase convention
spellcheckspellCheckcamelCase convention
http-equivhttpEquivHyphen removed, camelCase
onclickonClickEvent handler camelCase
onchangeonChangeEvent handler camelCase
onsubmitonSubmitEvent handler camelCase

인라인 스타일 변환: HTML vs JSX

인라인 스타일은 값의 형식과 속성 이름이 모두 바뀌기 때문에 HTML to JSX 변환에서 가장 오류가 발생하기 쉬운 부분입니다:

HTML style 속성
세미콜론으로 구분된 CSS 선언 문자열입니다. 속성 이름은 kebab-case를 사용합니다(background-color, font-size, border-radius). 값은 단위가 있는 숫자 값을 포함하여 항상 문자열입니다.
<div style="background-color: #fff;
  font-size: 14px;
  margin-top: 10px;">
JSX style prop
camelCase 속성 이름을 가진 JavaScript 객체입니다(backgroundColor, fontSize, borderRadius). 문자열 값은 따옴표로 감쌉니다. 단위 없는 숫자 값(lineHeight, opacity, zIndex, flexGrow)은 일반 숫자로 사용할 수 있습니다.
<div style={{
  backgroundColor: '#fff',
  fontSize: '14px',
  marginTop: 10
}}>

코드 예제

아래 예제는 다양한 언어와 환경에서 HTML을 JSX로 프로그래밍 방식으로 변환하는 방법을 보여줍니다. 각 예제는 속성 이름 변경, 스타일 변환, 자기 닫힘 태그 처리를 다룹니다.

JavaScript (DOM API)
// Simple attribute conversion using string replacement
function htmlToJsx(html) {
  return html
    .replace(/\bclass=/g, 'className=')
    .replace(/\bfor=/g, 'htmlFor=')
    .replace(/\btabindex=/g, 'tabIndex=')
    .replace(/<!--([\s\S]*?)-->/g, '{/*$1*/}')
}

htmlToJsx('<div class="box" tabindex="0"><!-- note --></div>')
// → '<div className="box" tabIndex="0">{/* note */}</div>'
JavaScript (html-react-parser)
import parse from 'html-react-parser'

// Parse HTML string into React elements (handles all JSX rules)
const element = parse('<div class="card"><img src="photo.jpg" alt="Photo"></div>')
// Returns: React.createElement('div', { className: 'card' },
//   React.createElement('img', { src: 'photo.jpg', alt: 'Photo' }))

// With custom element replacement
const options = {
  replace(domNode) {
    if (domNode.name === 'img') {
      return <OptimizedImage src={domNode.attribs.src} alt={domNode.attribs.alt} />
    }
  }
}
const custom = parse('<img src="photo.jpg" alt="Photo">', options)
Python (BeautifulSoup)
from bs4 import BeautifulSoup
import re

ATTR_MAP = {
    'class': 'className', 'for': 'htmlFor',
    'tabindex': 'tabIndex', 'readonly': 'readOnly',
    'maxlength': 'maxLength', 'autocomplete': 'autoComplete',
}

def html_to_jsx(html: str) -> str:
    """Convert HTML attribute names to JSX equivalents."""
    for html_attr, jsx_attr in ATTR_MAP.items():
        html = re.sub(rf'\b{html_attr}=', f'{jsx_attr}=', html)
    # Convert HTML comments to JSX comments
    html = re.sub(r'<!--(.*?)-->', r'{/*\1*/}', html)
    return html

print(html_to_jsx('<label for="email" class="field">Email</label>'))
# → '<label htmlFor="email" className="field">Email</label>'
Go
package main

import (
    "fmt"
    "strings"
)

var attrMap = map[string]string{
    "class=":    "className=",
    "for=":      "htmlFor=",
    "tabindex=": "tabIndex=",
    "readonly":  "readOnly",
}

func htmlToJSX(html string) string {
    result := html
    for old, new := range attrMap {
        result = strings.ReplaceAll(result, old, new)
    }
    // Convert comments
    result = strings.ReplaceAll(result, "<!--", "{/*")
    result = strings.ReplaceAll(result, "-->", "*/}")
    return result
}

func main() {
    html := `<div class="wrapper"><input readonly tabindex="1"></div>`
    fmt.Println(htmlToJSX(html))
    // → <div className="wrapper"><input readOnly tabIndex="1"></div>
}

자주 묻는 질문

HTML과 JSX의 차이점은 무엇인가요?
JSX는 React에서 사용하는 JavaScript 문법 확장입니다. HTML처럼 보이지만 React.createElement() 호출로 컴파일됩니다. 주요 차이점은 다음과 같습니다: class는 className이 되고, for는 htmlFor가 됩니다. 인라인 스타일은 CSS 문자열 대신 JavaScript 객체를 사용하며, <img />와 같은 빈 요소를 포함한 모든 태그를 명시적으로 닫아야 합니다. JSX는 또한 중괄호 안에 JavaScript 표현식을 임베드할 수 있습니다.
React에서 class 대신 className을 사용하는 이유는 무엇인가요?
'class'는 JavaScript의 예약 키워드입니다. JSX는 JavaScript 함수 호출로 컴파일되기 때문에 'class'를 prop 이름으로 사용하면 문법 오류가 발생합니다. React는 JavaScript가 DOM 요소의 CSS 클래스를 읽고 설정하는 데 이미 사용하는 DOM API 속성 이름(element.className)과 일치하기 때문에 'className'을 선택했습니다.
HTML을 JSX로 수동으로 변환해야 하나요?
아닙니다. 이 도구와 같은 온라인 변환기를 사용하거나 htmltojsx(npm)나 html-react-parser 같은 라이브러리로 자동화할 수 있습니다. 대규모 마이그레이션의 경우 codemod나 jscodeshift 같은 도구로 전체 코드베이스를 변환할 수 있습니다. 수동 변환은 몇 줄짜리 작은 코드 조각에만 실용적입니다.
JSX에서 인라인 스타일은 어떻게 처리되나요?
JSX에서 style 속성은 CSS 문자열이 아닌 JavaScript 객체를 받습니다. 속성 이름은 camelCase를 사용합니다(background-color 대신 backgroundColor). 값은 기본적으로 문자열이지만, lineHeight, opacity, zIndex와 같은 특정 숫자 속성은 단위 없이 일반 숫자를 받습니다. style={{ color: 'red' }}의 이중 중괄호는 특별한 문법이 아닙니다. 외부 중괄호는 JSX 표현식이고, 내부 중괄호는 JavaScript 객체 리터럴입니다.
JSX에서 HTML 주석을 사용할 수 있나요?
아닙니다. HTML 주석(<!-- comment -->)은 JSX에서 유효하지 않습니다. 대신 중괄호로 감싼 JavaScript 블록 주석을 사용하세요: {/* comment */}. 이 변환기는 변환을 자동으로 처리합니다. JSX 주석은 컴포넌트 반환의 최상위 레벨이 아닌 부모 요소 안에 있어야 합니다.
JSX에서 그대로 유지되는 HTML 속성은 무엇인가요?
대부분의 HTML 속성은 JSX에서 원래 이름을 유지합니다. 일반적인 예로는 id, src, href, alt, type, name, value, placeholder, disabled, hidden, 그리고 모든 data-* 및 aria-* 속성이 있습니다. HTML 이름이 DOM API 속성 이름과 다른 속성만 변경이 필요합니다: class는 className, for는 htmlFor, 그리고 소문자에서 camelCase로 바뀌는 다중 단어 속성들입니다.
dangerouslySetInnerHTML은 HTML to JSX 변환과 같은 것인가요?
아닙니다. dangerouslySetInnerHTML은 React의 렌더링을 우회하여 원시 HTML을 DOM에 직접 주입하므로 XSS 취약점의 위험이 있습니다. HTML to JSX 변환은 React의 가상 DOM을 통하는 실제 React 요소를 생성하며 기본적으로 안전합니다. 직접 제어하는 정적 마크업에는 HTML-to-JSX 변환을 사용하세요. dangerouslySetInnerHTML은 JSX로 변환할 수 없는 외부 소스의 신뢰할 수 있는 HTML을 렌더링해야 할 때만 사용하세요.