XML(eXtensible Markup Language)은 사용자 정의 태그를 사용하여 구조화된 데이터를 저장하고 전송하기 위한 텍스트 형식입니다. 구성 파일, 웹 서비스 및 Android 개발에 널리 사용됩니다. W3C 컨소시엄에 따르면 XML 사양은 2008년부터 안정적인 표준으로 유지되고 있습니다. XML은 스키마를 통한 검증 기능을 갖춘 엄격한 데이터 구조를 제공합니다.
주요 포인트
XML은 사람과 기계 모두가 읽을 수 있는 형식으로 문서를 인코딩하기 위한 규칙 집합을 정의하는 마크업 언어입니다. HTML과 달리 XML에는 고정된 태그 집합이 없습니다. 개발자는 데이터 구조에 해당하는 자신만의 태그를 만듭니다.
XML은 1996년 W3C 컨소시엄에 의해 SGML(Standard Generalized Markup Language)의 단순화된 하위 집합으로 개발되었습니다. XML의 주요 목표는 콘텐츠를 데이터 표현에서 분리하는 것입니다. 외관을 설명하는 HTML과 달리 XML은 데이터의 구조와 의미를 설명합니다.
XML의 핵심 속성은 확장성입니다. 프로젝트에 새로운 데이터 유형이 나타나면 개발자는 기존 구조를 변경하지 않고 새 태그를 추가하기만 하면 됩니다. 이는 XML을 장기적인 데이터 저장 및 다양한 시스템 간의 교환에 편리하게 만듭니다.
XML 구문은 HTML보다 엄격합니다. 각 여는 태그에는 해당하는 닫는 태그가 있어야 하며, 속성은 따옴표로 묶고, 태그 이름은 대소문자를 구분합니다. 문서에는 다른 모든 요소를 포함하는 정확히 하나의 루트 요소가 있어야 합니다.
XML 문서는 XML 버전과 인코딩을 지정하는 선언으로 시작할 수 있습니다. 그 다음 루트 요소가 오며, 그 안에 중첩된 요소, 속성, 텍스트 콘텐츠 및 주석이 포함될 수 있습니다. 빈 요소는 <element />로 작성됩니다.
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<book id="bk001">
<title>XML Developer Guide</title>
<author>John Smith</author>
<price currency="USD">29.99</price>
<published>2026-03-15</published>
</book>
<book id="bk002">
<title>Advanced XML Schemas</title>
<author>Jane Doe</author>
<price currency="USD">49.99</price>
</book>
</catalog>
올바른 형식(Well-formed) XML은 기본 규칙을 따라야 합니다. 각 여는 태그에 대해 닫는 태그가 필수이며, 중첩은 엄격하며(태그 중복 금지), 속성 값은 항상 따옴표 안에 있습니다. 규칙을 위반하면 문서가 유효하지 않게 되어 구문 분석이 불가능합니다.
XML 네임스페이스는 하나의 문서에서 다른 어휘의 요소를 사용할 때 이름 충돌 문제를 해결합니다. 네임스페이스는 어휘를 고유하게 식별하는 URI와 함께 xmlns 속성으로 정의됩니다.
XML Schema(XSD)는 XML 문서의 구조를 설명하는 언어입니다. XSD는 허용되는 요소와 속성, 해당 데이터 유형, 필수 여부 및 제약 조건을 정의합니다. 스키마는 처리 전에 자동 문서 검증을 허용하며, 이는 통합 솔루션에 중요합니다.
| 기술 | 목적 | 예 |
|---|---|---|
| DTD | 기본 구조 검증 | 오래됨, 기능 적음 |
| XSD | 엄격한 타입 지정 및 검증 | 업계 표준 |
| RELAX NG | XSD의 간결한 대안 | XSD보다 간단하고 읽기 쉬움 |
| XSLT | XML을 다른 형식으로 변환 | XML에서 HTML, PDF, CSV로 |
| XPath | 탐색 및 노드 선택 | XML 트리에 쿼리 |
XML은 Android 개발에서 중요한 역할을 합니다. Android 운영 체제는 사용자 인터페이스(레이아웃 파일), 애플리케이션 구성(AndroidManifest.xml), 리소스(strings, colors, themes) 및 벡터 그래픽(VectorDrawable)을 설명하는 데 XML을 사용합니다. iOS에서는 XML이 주로 Storyboard 및 구성 plist 파일에 덜 자주 사용됩니다.
Android에서는 각 애플리케이션 화면이 View 구성 요소(ConstraintLayout, LinearLayout, TextView, Button)의 계층 구조를 가진 XML 파일로 설명됩니다. 이 접근 방식은 애플리케이션 로직을 프레젠테이션에서 분리하여 유지 관리와 다양한 화면 적응을 단순화합니다. 리소스 XML 파일은 코드를 변경하지 않고 애플리케이션을 현지화할 수 있습니다.
일반적인 레이아웃 파일에는 중첩된 요소가 있는 루트 ConstraintLayout이 포함되며, 각 요소에는 위치, 크기 및 스타일의 속성이 있습니다. Android는 시작 시 성능 최적화를 위해 XML을 AXML 바이너리 형식으로 컴파일합니다.
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/welcome"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/click"
app:layout_constraintTop_toBottomOf="@id/title"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
XML 파싱은 모바일 플랫폼에서 두 가지 주요 접근 방식으로 수행됩니다. DOM(Document Object Model)은 전체 문서를 트리로 메모리에 로드하고, SAX(Simple API for XML)는 문서를 스트리밍 방식으로 읽으며 이벤트 핸들러를 호출합니다. DOM은 작은 문서에 편리하고, SAX는 메모리 제한이 있는 큰 파일에 적합합니다.
Android에는 스트림 파싱을 위한 XmlPullParser와 DOM 접근 방식을 위한 DocumentBuilder와 같은 내장 파서가 있습니다. iOS는 델리게이트 프로토콜과 함께 Foundation XMLParser를 사용합니다. 객체를 XML로 직렬화하기 위해 PHP의 SimpleXML 또는 Java의 Jackson XML과 같은 라이브러리가 자주 사용됩니다.
Android는 효율적인 XML 파싱을 위해 XmlPullParser 사용을 권장합니다. 파서는 이벤트 기반 모드로 작동합니다. next()를 호출하여 다음 요소로 이동하고 이벤트 유형(START_TAG, TEXT, END_TAG)을 반환합니다. 이를 통해 최소한의 메모리 소비로 모든 크기의 문서를 처리할 수 있습니다.
import org.xmlpull.v1.XmlPullParser
import org.xmlpull.v1.XmlPullParserException
import java.io.IOException
fun parseCatalog(parser: XmlPullParser): List<Book> {
val books = mutableListOf<Book>()
var eventType = parser.getEventType()
var currentBook: Book? = null
while (eventType != XmlPullParser.END_DOCUMENT) {
when (eventType) {
XmlPullParser.START_TAG -> {
when (parser.getName()) {
"book" -> currentBook = Book()
"title" -> parser.next()
"author" -> parser.next()
}
}
XmlPullParser.TEXT -> {
currentBook?.apply {
title = parser.getText() ?: ""
}
}
XmlPullParser.END_TAG -> {
if (parser.getName() == "book") {
currentBook?.let { books.add(it) }
}
}
}
eventType = parser.next()
}
return books
}
XML 사용 예제는 실제 프로젝트에서의 역할을 보여줍니다. Android 개발 외에도 XML은 빌드 구성, 데이터 설명 및 문서 워크플로에 사용됩니다. XML 구문 이해는 Maven, SOAP 서비스 및 많은 엔터프라이즈 도구 작업에 필요합니다.
pom.xml 파일은 Maven 프로젝트를 설명합니다. 종속성, 플러그인, 버전 및 빌드 프로필을 포함합니다. 각 종속성은 groupId, artifactId 및 version 태그로 지정됩니다. Maven은 저장소에서 지정된 라이브러리를 자동으로 다운로드합니다.
<?xml version="1.0" encoding="UTF-8"?>
<project
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>my-app</artifactId>
<version>1.0.0</version>
<dependencies>
<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>retrofit</artifactId>
<version>2.9.0</version>
</dependency>
</dependencies>
</project>
XML과 JSON의 선택은 프로젝트의 특정 요구 사항에 따라 다릅니다. JSON은 간결성과 속도가 중요한 REST API, 모바일 애플리케이션 및 구성에 적합합니다. XML은 엄격한 검증, 네임스페이스 및 데이터 변환이 필요한 엔터프라이즈 시스템, 문서 워크플로 및 Android 개발에서 필수적입니다.
XML은 장기적인 문서 저장 시나리오에서 우수합니다. XSD 스키마 덕분에 XML 문서를 자동으로 검증할 수 있으며, 이는 의료, 금융 및 법률 시스템에 중요합니다. XSLT 변환을 통해 단일 XML 소스에서 HTML, PDF 및 기타 형식을 생성할 수 있어 문서 워크플로가 간소화됩니다.
반면 JSON은 웹 API 및 모바일 애플리케이션의 표준이 되었습니다. JavaScript와의 쉬운 통합, 작은 크기 및 빠른 파싱 속도로 인해 JSON은 REST API, WebSocket 메시지 및 구성 파일에 선호되는 선택입니다. 대부분의 새 프로젝트에서는 JSON으로 시작하고 특정 요구 사항이 발생할 때만 XML로 전환하는 것이 좋습니다.
자주 묻는 질문
XML은 데이터의 구조와 내용을 설명하고, HTML은 외관과 표시를 설명합니다. XML은 모든 태그를 만들 수 있고, HTML은 고정된 집합이 있습니다. XML은 구문이 더 엄격하여 모든 태그를 닫아야 하지만 HTML은 닫히지 않은 태그를 허용합니다. XML은 데이터용, HTML은 표시용입니다.
XSD(XML Schema Definition)는 XML 문서의 구조를 설명하는 언어입니다. XSD는 허용되는 요소와 속성, 해당 데이터 유형, 필수 여부 및 제약 조건을 정의합니다. 스키마는 처리 전에 XML 문서의 자동 검증을 허용하여 오류를 방지하고 데이터 무결성을 보장합니다.
Android에서는 XML 파싱에 XmlPullParser를 사용합니다 — 내장 스트리밍 파서입니다. 이벤트 기반으로 작동하며 루프에서 START_TAG, TEXT 및 END_TAG를 처리하고 메모리를 효율적으로 관리합니다. 작은 문서의 경우 DocumentBuilderFactory를 통한 DOM 파서가 적합하며, 전체 문서를 노드 트리로 메모리에 로드합니다.
DTD(Document Type Definition)는 제한된 기능을 가진 오래된 검증 메커니즘으로, 데이터 유형(모든 것이 문자열)과 네임스페이스를 지원하지 않습니다. XSD는 데이터 유형(숫자, 날짜, 열거형), 네임스페이스 및 확장성을 지원하는 현대적인 대체품입니다. XSD 자체는 XML 문서인 반면 DTD는 자체 구문을 사용합니다.
네임스페이스는 XML 문서가 다른 소스의 요소를 결합할 때 이름 충돌을 방지합니다. 예를 들어, Android 레이아웃에서 View 태그는 android.view와 라이브러리 모두에서 올 수 있습니다. URI가 있는 xmlns 속성은 각 요소와 속성의 소스를 고유하게 식별합니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.