
온라인 HTML 포매터: 압축된 HTML을 사람이 읽을 수 있게 만들기
📷 Negative Space / Pexels온라인 HTML 포매터: 압축된 HTML을 사람이 읽을 수 있게 만들기
HTML 압축은 의도적인 최적화입니다. 하지만 그 결과물을 읽어야 할 때도 있죠. 언제, 왜 HTML을 포매팅해야 하는지, 그리고 온라인 포매터의 한계까지.
CMS 내보내기, 서드파티 템플릿, 또는 웹 스크레이퍼에서 HTML 파일을 열었을 때의 그 특유의 답답함이 있습니다. 40,000자의 완전히 들여쓰기 없이 한 줄로 이어진 압축된 마크업을 마주하는 그 순간이요. 구조를 파악해야 합니다. 내비게이션이 어디서 끝나고 본문이 어디서 시작하는지 찾아야 합니다. 지금 이 상태로는 불가능합니다.
이게 HTML 포매터가 존재하는 이유입니다. 문자 덩어리를 사람이 읽고 탐색할 수 있는 형태로 복원하는 것. ToolBox Hubs의 HTML 포매터가 정확히 그 역할을 합니다. 이 가이드에서는 언제 써야 하는지, 어떻게 동작하는지, 그리고 어떤 한계가 있는지를 다룹니다.
HTML이 압축되는 이유
압축(minification)은 의도적인 최적화입니다. HTML 파일은 네트워크를 통해 전달되고, 모든 바이트가 시간을 잡아먹습니다. 공백, 줄바꿈, 때로는 주석까지 제거하면 기능적 변화 없이 파일 크기를 10-30%까지 줄일 수 있습니다. 하루 수백만 페이지뷰 규모에서는 그 대역폭 절감이 의미 있습니다.
webpack, Vite, 각종 빌드 시스템, CDN이 이 작업을 합니다. 일부러 불편하게 만드는 게 아닙니다. 압축된 파일은 프로덕션 결과물이고, 포매팅된 버전은 개발을 위한 것입니다.
문제는 이런 경우에 생깁니다.
- 직접 만들지 않은 페이지를 분석해서 구조를 파악해야 할 때
- 외부 업체의 이메일 템플릿이 한 줄짜리 문자로 오는 경우
- CMS가 압축된 HTML을 내보내는데 일부를 수정해야 할 때
- 렌더링 문제를 디버깅하면서 특정 요소를 빨리 찾아야 할 때
- 동료가 보낸 "HTML"이 빌드 파이프라인을 거친 게 분명할 때
이 모든 경우에 압축의 역방향이 필요합니다. 포매팅입니다.
포매팅이 실제로 하는 일
HTML 포매터가 하는 핵심 작업은 두 가지입니다. 중첩을 보여주는 들여쓰기 추가, 그리고 요소를 구분하는 줄바꿈 추가입니다.
이런 압축된 입력이 있다면:
<!DOCTYPE html><html><head><title>내 페이지</title></head><body><header><nav><ul><li><a href="/">홈</a></li><li><a href="/about">소개</a></li></ul></nav></header><main><h1>안녕하세요</h1><p>본문 내용입니다.</p></main></body></html>
포매터는 이렇게 변환합니다.
<!DOCTYPE html>
<html>
<head>
<title>내 페이지</title>
</head>
<body>
<header>
<nav>
<ul>
<li><a href="/">홈</a></li>
<li><a href="/about">소개</a></li>
</ul>
</nav>
</header>
<main>
<h1>안녕하세요</h1>
<p>본문 내용입니다.</p>
</main>
</body>
</html>
페이지 구조를 즉시 파악할 수 있습니다. head, 내비게이션이 있는 header, 본문 콘텐츠. 중첩이 문서 계층을 보여줍니다. 이게 전부입니다.
<li><a href="/">홈</a></li>가 세 줄로 펼쳐지지 않고 한 줄에 유지된다는 것도 눈에 띕니다. 의도적입니다. 앵커는 리스트 아이템 안의 인라인 콘텐츠이고, 여러 줄로 나눠봐야 득이 없습니다. 이에 대해서는 잠시 후에 설명합니다.
블록 요소 vs. 인라인 요소: 포매팅에서 왜 중요한가
블록과 인라인 요소의 구분은 HTML 포매터가 어떻게 작동하는지의 핵심이라 간략히 이해해 두는 게 좋습니다.
블록 요소는 자체 "블록" 공간을 만듭니다. 새 줄에서 시작하고 가로 전체를 차지합니다. div, p, section, article, header, footer, h1부터 h6, ul, ol, li, table 등이 여기에 해당합니다. 들여쓰기의 자연스러운 대상입니다. 각각 자기 줄을 갖고, 내용은 그 아래에 들여쓰여집니다.
인라인 요소는 텍스트 안에서 문장의 단어들처럼 흘러갑니다. span, a, strong, em, code, img, button 등입니다. 포매팅이 더 까다롭습니다. 이런 HTML이 있다면:
<p>자세한 내용은 <a href="/docs">문서</a>를 참고하세요.</p>
포매터가 <a> 태그 주변에 순진하게 줄바꿈을 추가하면:
<p>
자세한 내용은
<a href="/docs">문서</a>를 참고하세요.
</p>
이 줄바꿈들이 렌더링된 HTML에서 공백이 되어 시각적 출력이 달라질 수 있습니다. 잘 구현된 포매터는 인라인 요소를 보수적으로 처리합니다.
**빈 요소(Void element)**는 세 번째 범주입니다. 자식 요소를 가질 수 없어서 닫는 태그가 필요 없습니다. br, hr, img, input, meta, link 등입니다. HTML 스펙이 명시적으로 금지하기 때문에 닫는 태그가 추가되지 않습니다. <br> vs <br />의 경우, HTML5에서는 둘 다 맞습니다. 자기 닫기 슬래시는 HTML에서 선택사항입니다(XHTML과 JSX에서는 필수지만).
실제로 유용한 상황들
이메일 템플릿 읽기
HTML 이메일은 거의 예외 없이 끔찍한 테이블 기반 마크업으로 작성된 뒤 압축됩니다. 외부 업체가 커스터마이징할 이메일 템플릿을 보내오거나, Outlook에서 이메일이 이상하게 보이는 이유를 디버깅할 때(진짜 고통스러운 경험입니다), 첫 번째 단계는 HTML을 읽을 수 있게 만드는 겁니다.
포매터에 붙여넣으세요. 편집하려는 섹션에 해당하는 테이블 셀을 찾으세요. 변경하세요. 필요하면 다시 압축하면 됩니다(대부분의 이메일 발송 서비스는 포매팅된 HTML도 잘 처리합니다).
경쟁사 페이지 분석
브라우저 DevTools에서 페이지를 보면 인스펙터가 자동으로 포매팅해서 보여줍니다. 하지만 curl이나 스크레이퍼로 원시 HTML을 다운로드하면 프로덕션 결과물을 받게 됩니다. 대개 압축된 형태로요.
포매터로 구조를 빠르게 파악할 수 있습니다. 클래스명과 구조에서 어떤 CMS나 프레임워크를 쓰는지 알 수 있고, 레이아웃 접근 방식을 이해하고, 궁금한 특정 요소를 찾을 수 있습니다.
이건 합법적이고 흔한 일이며 진짜 도움이 됩니다. HTML은 공개된 것이고 읽는 건 괜찮습니다.
CMS 출력 디버깅
WordPress, Drupal 등은 깊이 중첩된 반복적인 HTML을 만들어냅니다. 뭔가 시각적으로 잘못되어 원인이 되는 요소를 찾아야 할 때, 포매팅된 HTML이 압축된 덩어리보다 훨씬 검색하기 쉽습니다.
DevTools에서 관련 섹션을 복사해 포매터에 붙여넣고, 문제의 div나 잘못된 클래스를 찾으세요. 복잡한 레이아웃에서 인스펙터 트리를 탐색하는 것보다 빠릅니다.
HTML 변경 사항이 포함된 풀 리퀘스트 리뷰
템플릿 파일이 자동 포매팅되거나 공백이 정규화되면, 들여쓰기가 바뀌어 모든 줄이 변경된 것처럼 보이는 읽기 불가능한 diff가 생길 수 있습니다. 이전 버전과 새 버전을 일관된 설정으로 포매터를 통해 실행한 뒤 텍스트 diff 도구로 비교하면 실제 의미 변경 사항을 파악할 수 있습니다.
포매터를 쓰면 안 되는 경우
포매터가 항상 맞는 도구는 아닙니다.
포매팅이 강제되는 코드베이스에서 작업할 때. 프로젝트가 Prettier를 쓰고 있다면(대부분의 현대 프로젝트가 그렇습니다) 이미 포매터가 있습니다. 여기에 다른 포매터를 섞으면 불일관성이 생깁니다. Prettier는 HTML, JSX 외 여러 형식을 처리합니다. 프로젝트 파일에는 Prettier를 사용하세요.
정확한 공백이 중요할 때. pre 태그, textarea 요소, 또는 white-space: pre로 스타일된 요소 내부에서는 공백이 의미를 가집니다. 다시 포매팅하면 내용이 바뀝니다. 좋은 포매터는 그 영역을 건드리지 않겠지만, 만약 건드린다면 그 용도로는 쓰지 마세요.
압축이 목적일 때. 파일 크기를 줄이는 게 목표라면 HTML Minifier가 필요합니다. 이 도구와 반대입니다. 포매팅은 파일 크기를 늘립니다. 압축은 줄입니다.
JSX 작업 시. JSX는 HTML과 규칙이 다릅니다. 올바른 파서를 사용한 Prettier를 쓰세요. HTML 포매터는 JSX 클래스명, 자기 닫기 요구사항, 표현식 문법을 잘못 처리합니다.
들여쓰기 논쟁: 2칸, 4칸, 탭
여기서 의견을 말씀드립니다. HTML은 순식간에 깊이 중첩됩니다. 일반적인 페이지 구조만 봐도:
html
body
main
section
article
div
p
span
실제 내용을 한 글자도 쓰기 전에 이미 8단계입니다. 4칸 들여쓰기면 내용이 32칸 들어가 있습니다. 80자 표준 줄에서 48자가 남습니다. 속성 하나 두 개만 추가해도 줄이 넘어갑니다.
2칸이면 같은 깊이에서 16칸입니다. 64자의 줄 공간이 있습니다. 모든 게 들어갑니다. 구조는 여전히 명확합니다. 계층이 여전히 잘 보입니다.
탭은 더 깔끔하기도 합니다(파일에서 단일 문자이고, 에디터에서 원하는 너비로 표시할 수 있으니까요). 하지만 탭은 에디터 간 일관성에서 논란이 있습니다.
제 결론: HTML에는 2칸. 실무에서 가장 흔한 선택이고(Google HTML 스타일 가이드, 대부분의 프런트엔드 프레임워크), 4칸 들여쓰기가 답답하게 느껴지는 깊은 중첩에서도 잘 작동합니다.
팀 표준이 다르다면 그걸 따르세요. 코드베이스 내 일관성이 외부 의견보다 훨씬 중요합니다.
도구가 엣지 케이스를 처리하는 방법
알아두면 좋은 동작들입니다.
주석은 보존됩니다. 조건부 주석(<!--[if IE]>...), 저작권 표시, 빌드 타임 주석은 출력에 그대로 남습니다.
script, style 내용은 건드리지 않습니다. <script> 태그 안의 JavaScript와 <style> 태그 안의 CSS는 HTML이 아닙니다. 제대로 구현된 포매터는 HTML 마크업처럼 들여쓰려 하지 않고 내용을 그대로 둡니다. JavaScript를 포매팅하고 싶다면 별도의 JS 포매터를 사용하세요.
잘못된 HTML도 최대한 처리합니다. 실제 HTML은 기술적으로 유효하지 않은 경우가 많습니다. 누락된 닫는 태그, 부적절하게 중첩된 요소, 따옴표 없는 속성 등이요. 포매터는 유효하지 않은 입력을 거부하기보다는 받은 것을 파싱하고 포매팅하려 합니다. 결과가 완벽하지 않을 수 있지만, 오류 대신 읽을 수 있는 무언가를 얻게 됩니다.
속성 순서는 보존됩니다. 포매터는 속성을 재정렬하지 않습니다. 원본에서 class가 id 앞에 있다면 출력에서도 그렇습니다.
압축의 역방향 문제
알아두어야 할 한 가지: 포매팅이 항상 압축을 완벽하게 되돌리지는 않습니다. 압축기는 되돌릴 수 없는 선택을 하기도 합니다.
- 선택적 닫는 태그 제거(
</li>,</td>) — 브라우저가 추론할 수 있어서 압축기가 생략하고, 포매터가 다시 추가하지 않을 수 있습니다 - 불리언 속성 축약(
disabled="disabled"을 그냥disabled로) - 속성 따옴표 스타일 정규화
즉, 압축된 파일을 포매팅한 뒤 다시 압축하면 원래 압축 파일과 약간 다를 수 있습니다. 괜찮습니다. 둘 다 기능적으로 동일합니다. 완벽한 왕복을 기대하지 마세요.
실용적인 워크플로
출처를 알 수 없는 HTML이 왔을 때 어떻게 접근하는지입니다.
-
원시 HTML을 HTML 포매터에 붙여넣습니다.
-
먼저 최상위 구조를 봅니다.
body아래 루트 레벨에 어떤 요소들이 있나요? 페이지의 대략적인 레이아웃을 알 수 있습니다. -
브라우저의 찾기(Ctrl+F / Cmd+F)를 사용해 특정 클래스명, ID, 요소 유형으로 바로 이동합니다.
-
두 버전을 비교해야 할 때는 둘 다 포매팅한 뒤 텍스트 diff 도구로 실제 차이를 확인합니다.
-
내 HTML 템플릿을 정리해야 할 때는 포매팅하고 구조를 검토한 뒤, 그 다음부터의 지속적인 포매팅은 에디터의 Prettier 설정에 맡깁니다.
포매터는 이해의 출발점이지, 제대로 된 개발 도구를 대체하는 게 아닙니다.
함께 쓰면 좋은 관련 도구들
포매터는 세트로 쓸 때 더 유용합니다.
- HTML Minifier — 반대 작업. 공백을 제거해 파일 크기를 줄입니다.
- HTML to Markdown — HTML을 읽기 쉬운 마크다운으로 변환합니다. 페이지에서 콘텐츠를 추출할 때 유용합니다.
- XML Formatter — 같은 개념인데 XML용. SVG 파일, RSS 피드, API 응답에 유용합니다.
포매팅된 HTML에서 시작해 페이지가 의미적으로 무엇을 하는지 이해하고 싶다면, HTML to Markdown 변환기로 태그를 벗겨내고 콘텐츠 구조를 명확하게 볼 수 있습니다. 원시 마크업보다 유용한 경우가 있습니다.
HTML 포매터는 무료이고 계정이 필요 없습니다. 붙여넣고, 포매팅하고, 끝입니다.