2025-09-05 00:12
-
XML은 사람과 기계가 모두 이해할 수 있는 형태로 데이터를 저장하고 전송하기 위해 만들어진 마크업 언어입니다.
-
HTML과 달리 태그가 미리 정해져 있지 않아, 사용자가 데이터 구조에 맞춰 직접 태그를 정의하는 강력한 유연성을 제공합니다.
-
현재는 JSON에 많은 자리를 내주었지만, 여전히 설정 파일, 문서 표준, 레거시 시스템 등에서 중요한 역할을 수행합니다.
XML 완벽 가이드 데이터 교환의 표준을 파헤치다
오늘날 우리는 수많은 데이터와 함께 살아갑니다. 스마트폰 앱부터 거대한 기업의 서버까지, 모든 시스템은 데이터를 주고받으며 동작합니다. 그런데 서로 다른 시스템들이 어떻게 약속이라도 한 듯 데이터를 정확하게 이해하고 처리할 수 있을까요? 그 비밀의 중심에는 ‘데이터를 표현하는 표준 형식’이 있습니다. 그리고 그 표준의 역사에서 가장 중요한 역할을 한 기술 중 하나가 바로 **XML(Extensible Markup Language)**입니다.
많은 개발자들이 “XML은 이제 낡은 기술 아닌가요? 요즘은 JSON을 더 많이 쓰잖아요”라고 말하곤 합니다. 틀린 말은 아닙니다. 하지만 XML이 왜 만들어졌고, 어떤 문제를 해결했으며, 지금도 어떤 분야에서 강력한 힘을 발휘하는지 이해하는 것은 단순히 기술 하나를 배우는 것 이상의 의미를 가집니다. 그것은 데이터 구조화의 본질을 꿰뚫는 일이며, 더 나은 개발자로 성장하는 중요한 발판이 됩니다.
이 핸드북은 XML의 탄생 배경부터 기본 구조, 활용법, 그리고 현대 기술과의 관계까지, XML에 대한 모든 것을 가장 깊이 있고 이해하기 쉽게 설명하기 위해 작성되었습니다. 함께 데이터 교환의 위대한 여정을 떠나보겠습니다.
1. XML은 왜 세상에 나왔을까? (탄생 배경)
XML의 등장을 이해하려면 먼저 그 ‘부모’와 ‘형제’를 알아야 합니다. 바로 SGML과 HTML입니다.
부모: 너무 복잡했던 SGML (Standard Generalized Markup Language)
1980년대에 탄생한 SGML은 문서의 구조와 내용을 정의하는 국제 표준이었습니다. 매우 강력하고 유연해서 복잡한 기술 문서나 정부 문서를 구조화하는 데 사용되었죠. 하지만 기능이 너무 많은 만큼 배우고 사용하기가 극도로 어려웠습니다. 마치 전문가용 항공기 조종법처럼, 일반인이 다루기에는 너무 복잡한 기술이었습니다.
형제: 표현에만 집중한 HTML (HyperText Markup Language)
웹의 등장과 함께 SGML을 단순화한 HTML이 세상에 나왔습니다. HTML의 목적은 단 하나, ‘데이터를 웹 브라우저에 어떻게 보여줄 것인가’였습니다. <p>
태그는 문단을, <h1>
태그는 큰 제목을, <img>
태그는 이미지를 보여주라고 브라우저에 지시하죠.
하지만 HTML에는 치명적인 한계가 있었습니다. 데이터의 ‘의미’가 아닌 ‘보여지는 방식’에만 집중했다는 점입니다. 예를 들어, 다음과 같은 HTML 코드가 있다고 가정해 봅시다.
HTML
<h1>신짱구</h1>
<p>떡잎마을, 5세</p>
이 코드를 보면 우리는 ‘신짱구’가 이름이고, ‘떡잎마을’이 주소, ‘5세’가 나이라는 것을 짐작할 수 있습니다. 하지만 컴퓨터(기계)는 이것을 어떻게 이해할까요? 컴퓨터에게 <h1>
은 그냥 ‘큰 글씨’일 뿐, ‘이름’이라는 의미를 담고 있지는 않습니다.
구원투수의 등장: XML (Extensible Markup Language)
바로 이 지점에서 개발자들은 거대한 문제에 부딪혔습니다. “사람이 아닌 기계들끼리 데이터를 주고받으려면 어떻게 해야 할까?” 기계가 데이터의 구조와 의미를 명확하게 이해할 수 있는 새로운 표준이 필요했습니다.
그래서 1996년, 월드 와이드 웹 컨소시엄(W3C)은 SGML의 복잡성은 덜어내고, HTML의 한계는 뛰어넘는 새로운 언어를 만들기 시작했습니다. 그 결과물이 바로 XML입니다.
XML의 핵심 철학은 다음과 같습니다.
-
데이터의 ‘표현’과 ‘내용’을 분리한다: 데이터가 어떻게 보이는지가 아니라, 데이터가 무엇인지를 설명하는 데 집중합니다.
-
확장 가능하다 (Extensible): HTML처럼 정해진 태그만 쓰는 것이 아니라, 사용자가 데이터의 구조에 맞게 직접 태그를 만들어서 사용할 수 있습니다.
위의 ‘신짱구’ 정보를 XML로 표현하면 이렇게 됩니다.
XML
<character>
<name>신짱구</name>
<address>떡잎마을</address>
<age>5</age>
</character>
이제 컴퓨터도 <name>
태그 안의 내용은 ‘이름’이고, <age>
태그 안의 내용은 ‘나이’라는 것을 명확하게 이해할 수 있게 되었습니다. 이것이 바로 XML이 가져온 혁신입니다. XML은 데이터를 담는 규칙 그 자체를 정의하는 언어인 셈입니다. 마치 배송 상자에 붙이는 라벨에 ‘받는 사람’, ‘보내는 사람’처럼 정해진 항목만 있는 것이 아니라, 내용물에 따라 ‘부품 번호’, ‘색상’, ‘무게’ 등 필요한 라벨을 내가 직접 만들어 붙일 수 있게 된 것과 같습니다.
2. XML의 뼈대: 구조와 문법
XML은 매우 엄격한 규칙을 따릅니다. 이 규칙들을 지켜야만 ‘문법적으로 올바른(Well-formed)’ XML 문서로 인정받을 수 있습니다.
기본 구성 요소
-
요소 (Element): XML 문서를 구성하는 가장 기본적인 단위입니다. 시작 태그(Opening Tag), 내용(Content), 종료 태그(Closing Tag)로 이루어집니다.
<name>신짱구</name>
에서<name>
은 시작 태그,신짱구
는 내용,</name>
은 종료 태그입니다.
-
속성 (Attribute): 요소에 대한 추가적인 정보를 제공하며, 시작 태그 안에
이름="값"
형태로 표현됩니다.-
<character id="jjanggu">
에서id="jjanggu"
가 속성입니다. -
언제 속성을 쓰고, 언제 요소를 쓸까? 명확한 정답은 없지만, 일반적으로 데이터 자체는 요소로, 데이터에 대한 메타데이터(데이터를 설명하는 데이터)는 속성으로 표현하는 것이 좋습니다. 예를 들어, 책의 ‘제목’은 요소로, 책의 ‘ISBN’ 번호는 속성으로 표현할 수 있습니다.
-
-
프롤로그 (Prologue): XML 문서의 가장 첫 줄에 오는 선언부입니다. 이 문서가 어떤 XML 버전을 따르고 어떤 방식으로 인코딩되었는지를 명시합니다.
<?xml version="1.0" encoding="UTF-8"?>
핵심 문법 규칙: 엄격한 문법 선생님
XML의 문법은 매우 엄격해서, 작은 실수 하나도 용납하지 않습니다.
-
하나의 루트 요소 (Root Element): 모든 XML 문서는 모든 요소를 감싸는 단 하나의 최상위 요소(루트 요소)를 가져야 합니다.
-
종료 태그 필수: 모든 태그는 반드시 짝이 맞는 종료 태그를 가져야 합니다. (
<p>
만 쓰고 닫지 않는 HTML과 다릅니다.) 내용이 없는 태그는<br/>
와 같이 셀프 클로징(Self-closing)할 수 있습니다. -
올바른 중첩 (Nesting): 태그는 올바른 순서로 포함되어야 합니다.
<b><i>텍스트</b></i>
와 같은 순서는 허용되지 않습니다.<b><i>텍스트</i></b>
처럼 나중에 연 태그를 먼저 닫아야 합니다. -
대소문자 구분:
<name>
과<Name>
은 서로 다른 태그로 인식됩니다. -
속성값은 따옴표로: 모든 속성값은 반드시 큰따옴표(
"
)나 작은따옴표('
)로 감싸야 합니다.
이러한 엄격함 덕분에 어떤 시스템에서든 XML 문서를 일관되게 해석하고 처리할 수 있는 것입니다.
트리 구조 (Tree Structure)
XML 문서는 부모-자식 관계가 있는 계층적인 트리 구조를 가집니다. 최상위에는 루트 요소가 있고, 그 아래로 자식 요소들이 나무의 가지처럼 뻗어 나가는 형태입니다. 이러한 구조 덕분에 데이터를 탐색하고 특정 부분에 접근하기가 매우 용이합니다.
3. XML 활용하기: 데이터의 설계부터 변환까지
단순히 XML 문서를 작성하는 것을 넘어, XML을 제대로 활용하려면 몇 가지 중요한 개념들을 알아야 합니다.
데이터 설계도: DTD와 XSD
“이 XML 문서에는 어떤 종류의 태그가 들어갈 수 있고, 그 태그들은 어떤 순서로 나와야 할까?” 와 같은 규칙을 정의한 ‘설계도’가 필요할 때가 있습니다. 이 설계도를 통해 XML 문서가 유효한지(Valid) 검증할 수 있습니다.
-
DTD (Document Type Definition): 초기에 사용되던 설계도입니다. 문법이 간단하지만, 데이터 타입을 상세하게 정의(예: 이 요소는 반드시 숫자여야 한다)하는 기능이 부족합니다.
-
XSD (XML Schema Definition): DTD를 대체하기 위해 나온 현대적인 설계도입니다. XML 문법 자체를 사용해 작성되며, 정수, 문자열, 날짜 등 다양한 데이터 타입을 지원하고 훨씬 더 복잡하고 정교한 규칙을 정의할 수 있습니다. DTD가 간단한 체크리스트라면, XSD는 재료의 종류와 규격까지 명시한 상세한 청사진과 같습니다.
XML
<!-- characters.xsd 예시 -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="character">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
위 XSD는 <character>
요소가 name
, address
, age
자식 요소를 순서대로 가져야 하며, age
는 반드시 정수(integer)여야 한다는 규칙을 정의합니다.
데이터 처리: XML 파서(Parser)
프로그램이 XML 문서를 읽고 사용하려면 ‘파서(Parser)‘가 필요합니다. 파서는 XML 문서를 프로그램이 이해할 수 있는 구조로 변환해주는 역할을 합니다. 대표적으로 두 가지 방식이 있습니다.
-
DOM (Document Object Model) 파서: XML 문서 전체를 메모리에 트리 구조로 불러온 뒤 처리합니다. 문서의 어느 부분이든 자유롭게 이동하고 수정할 수 있어 편리하지만, 문서가 클 경우 메모리를 많이 차지하는 단점이 있습니다. 마치 지도 전체를 펼쳐놓고 길을 찾는 것과 같습니다.
-
SAX (Simple API for XML) 파서: XML 문서를 처음부터 순차적으로 한 줄씩 읽어 들이며 ‘이벤트’를 발생시킵니다. 예를 들어, 시작 태그를 만나면 ‘시작 태그 이벤트’를, 내용을 만나면 ‘내용 이벤트’를 발생시키는 식입니다. 메모리를 거의 사용하지 않아 매우 큰 문서를 처리하기에 좋지만, 한 방향으로만 읽기 때문에 이전 데이터로 돌아갈 수 없는 불편함이 있습니다. 마치 내비게이션이 “다음 사거리에서 우회전하세요”처럼 순서대로 길을 안내해주는 것과 같습니다.
데이터 검색과 변환: XPath와 XSLT
-
XPath (XML Path Language): XML 문서 내의 특정 요소나 속성을 찾아가기 위한 경로를 지정하는 언어입니다. 파일 시스템에서
/home/user/documents
처럼 경로를 지정하듯, XPath를 사용해/character/name
과 같이 원하는 데이터에 정확하게 접근할 수 있습니다. XML 문서의 GPS 좌표라고 생각할 수 있습니다. -
XSLT (Extensible Stylesheet Language Transformations): XML 문서를 다른 형태의 문서(예: HTML, 일반 텍스트, 또는 다른 구조의 XML)로 변환하는 데 사용되는 언어입니다. XPath로 원하는 데이터를 선택한 뒤, XSLT의 규칙에 따라 새로운 문서를 생성합니다. 이 기능 덕분에 XML 데이터 하나로 웹 페이지, PDF 보고서, 모바일 앱용 데이터 등 다양한 결과물을 만들어낼 수 있습니다. 마치 하나의 상세한 보고서(XML)를 가지고 요약 발표 자료(HTML)를 만드는 번역가나 편집자와 같습니다.
4. XML의 현재와 미래: JSON과의 비교
앞서 언급했듯, 현대 웹 개발, 특히 API 통신 분야에서는 XML보다 JSON(JavaScript Object Notation)이 더 널리 쓰입니다. 그 이유는 무엇일까요?
항목 | XML | JSON |
---|---|---|
가독성 | 태그 때문에 상대적으로 장황함 | 간결하고 사람이 읽기 편함 |
문법 | 엄격하며, 종료 태그가 필수 | 더 단순하고 유연함 |
파싱 속도 | DOM/SAX 파서 필요, 상대적으로 무거움 | JavaScript에서 네이티브하게 지원, 매우 빠름 |
데이터 타입 | 기본적으로 모두 텍스트. XSD로 정의 필요 | String, Number, Boolean, Array, Object 지원 |
주석 | <!-- 주석 --> 형태로 지원 | 공식적으로 지원하지 않음 |
확장성/검증 | 네임스페이스, XSD 등 강력한 검증 기능 | 스키마를 통한 검증 기능이 있지만 XML만큼 표준화되진 않음 |
웹 브라우저의 JavaScript 엔진이 JSON을 훨씬 더 빠르고 쉽게 처리할 수 있기 때문에, 웹 API에서는 JSON이 대세가 되었습니다. 문법이 간결해 데이터의 크기가 작고 네트워크 전송 비용도 적게 든다는 장점도 있습니다.
그렇다면 XML은 이제 사라질 기술일까?
그렇지 않습니다. XML은 특정 분야에서 여전히 대체 불가능한 강력함을 자랑합니다.
-
문서 중심 시스템: MS Office의
.docx
,.xlsx
파일의 내부 구조는 XML 기반(Office Open XML)입니다. 문서의 복잡한 구조, 서식, 메타데이터를 표현하는 데 XML만큼 강력한 도구가 없습니다. -
설정 파일(Configuration): Java 생태계(특히 Spring Framework 초기 버전)나 .NET 프로젝트(
.csproj
) 등 많은 플랫폼에서 애플리케이션의 복잡한 설정을 정의하는 데 XML을 사용해왔습니다. 계층 구조가 명확하고 주석을 달 수 있어 가독성이 높기 때문입니다. -
엔터프라이즈 환경: 강력한 스키마 검증(XSD)과 변환(XSLT) 기능이 필수적인 금융, 공공, 제조 등의 대규모 기업 시스템 간 데이터 교환(특히 SOAP 웹 서비스)에서는 여전히 XML이 표준으로 사용됩니다.
-
벡터 그래픽: SVG(Scalable Vector Graphics)는 사실상 XML입니다. 이미지의 도형, 색상, 경로를 XML 태그로 정의하여, 크기를 조절해도 깨지지 않는 고품질 그래픽을 만들어냅니다.
결론: 데이터 구조화의 시대를 연 위대한 표준
XML은 단순히 데이터를 감싸는 껍데기가 아닙니다. 그것은 서로 다른 시스템들이 소통할 수 있는 언어의 문법을 제공한 위대한 발명품이었습니다. 비록 웹 API의 왕좌는 JSON에게 넘겨주었지만, XML이 제시했던 ‘데이터의 구조화’, ‘내용과 표현의 분리’, ‘확장 가능한 형식’이라는 철학은 오늘날의 모든 데이터 기술에 깊숙이 녹아 있습니다.
XML을 이해하는 것은 과거의 기술을 배우는 것이 아니라, 우리가 매일 다루는 데이터의 본질과 역사를 이해하는 것입니다. 이 핸드북이 여러분이 데이터의 세계를 더 깊이 탐험하는 데 훌륭한 지도가 되기를 바랍니다.