실제 개발에서는 데이터를 직접 코드에 작성하는 경우보다 외부 시스템에서 전달받는 경우가 훨씬 많다.
대표적인 예가 공공데이터포털(Open API), 기상청 API, 지도 API, 금융 API 등이다.
이러한 데이터는 대부분 CSV, XML, JSON 형태로 제공된다.
과거에는 XML이 많이 사용되었지만, 현재는 대부분 JSON을 사용한다. 그렇다고 XML이 사라진 것은 아니다. 공공기관이나 오래된 시스템에서는 XML을 사용하는 경우가 여전히 많으며, Java에서는 XML을 처리하는 SAX, DOM Parser도 자주 등장한다.
이번 글에서는 공공데이터의 형태와 XML의 구조, SAX와 DOM Parser의 차이, 그리고 JSON의 특징까지 정리해보려고 한다.
공공데이터란 국가기관이나 공공기관이 생산하거나 관리하는 공적인 정보를 의미한다.
대표적인 예는 다음과 같다.
이러한 데이터는 대부분 Open API 형태로 제공되며 프로그램에서 쉽게 사용할 수 있도록 일정한 형식을 가진다.
대표적인 데이터 형식은 다음 세 가지이다.
CSV(Comma Separated Values)는 가장 단순한 형태의 데이터이다.
이름 그대로 쉼표(,) 로 데이터를 구분한다.
id,name,age
1,Kim,20
2,Lee,25
3,Park,30
간단한 테이블 데이터를 저장할 때 많이 사용된다.
XML(Extensible Markup Language)은 태그를 이용하여 데이터를 표현하는 문서 형식이다.
HTML과 비슷하게 생겼지만 목적은 완전히 다르다.
HTML은 화면을 표현하기 위한 언어이고,
XML은 데이터를 저장하고 전달하기 위한 언어이다.
<person>
<name>Kim</name>
<age>20</age>
</person>
XML은 구조가 명확하고 확장성이 뛰어나기 때문에 공공데이터에서 많이 사용되었다.
JSON(JavaScript Object Notation)은 현재 가장 많이 사용되는 데이터 교환 형식이다.
객체를 Key-Value 형태로 표현한다.
{
"name": "Kim",
"age": 20
}
현재 대부분의 REST API는 JSON을 기본 형식으로 사용한다.
| 형식 | 장점 | 단점 |
|---|---|---|
| CSV | 용량이 작고 단순하다. | 구조 표현이 어렵다. |
| XML | 계층 구조 표현이 가능하다. | 문법이 복잡하고 용량이 크다. |
| JSON | 가볍고 사용하기 쉽다. | 주석을 사용할 수 없다. |
현재는 JSON이 가장 많이 사용되지만 XML 역시 공공데이터나 레거시 시스템에서는 여전히 중요한 역할을 한다.
XML은 Extensible Markup Language의 약자이다.
"확장 가능한 마크업 언어"라는 의미이며, 필요한 태그를 개발자가 직접 정의하여 사용할 수 있다.
예를 들어 사람 정보를 저장한다면 다음과 같이 작성할 수 있다.
<person>
<name>Kim</name>
<age>20</age>
</person>
학생이라면
<student>
<name>Hong</name>
<grade>3</grade>
</student>
처럼 자유롭게 태그를 만들 수 있다.
이것이 HTML과 가장 큰 차이점이다.
XML은 반드시 문법을 지켜야 한다.
이를 Well-Formed XML이라고 한다.
대표적인 규칙은 다음과 같다.
문서는 일반적으로 다음과 같이 시작한다.
<?xml version="1.0" encoding="UTF-8"?>
을 지정한다.
XML에는 최상위 태그가 반드시 하나 존재해야 한다.
올바른 예
<students>
...
</students>
잘못된 예
<student></student>
<teacher></teacher>
루트 태그가 두 개이므로 잘못된 XML이다.
올바른 예
<name>Kim</name>
잘못된 예
<name>Kim</age>
<Name>
과
<name>
은 서로 다른 태그이다.
태그에는 속성을 가질 수 있다.
<student id="1">
여기서
id → 속성 이름
1 → 속성 값
이다.
XML은 개발자가 자유롭게 태그를 만들 수 있다.
그러다 보니 사람마다 태그 이름을 다르게 작성하면 문제가 발생한다.
이를 방지하기 위해 XML 문서의 규칙을 정의하는 방법이 존재한다.
대표적인 방법은
이다.
이를 이용하면 XML 문서가 정해진 규칙대로 작성되었는지 검사할 수 있다.
이러한 XML을 Valid XML이라고 한다.
XML은 단순한 문자열이 아니다.
프로그램에서 원하는 데이터를 사용하려면 XML을 분석해야 한다.
이 과정을 Parsing이라고 한다.
XML 문서
↓
Parser
↓
Java 객체
Java에서는 대표적으로 두 가지 Parser를 제공한다.
SAX(Simple API for XML)는 XML을 처음부터 끝까지 한 줄씩 읽으면서 이벤트 방식으로 처리하는 Parser이다.
문서 읽기
↓
시작 태그 발견
↓
이벤트 발생
↓
데이터 처리
↓
다음 태그 읽기
메모리에 XML 전체를 저장하지 않는다.
필요한 순간에만 처리한다.
즉,
속도는 빠르지만 탐색은 불편하다.
SAX는 태그를 만날 때마다 이벤트가 발생한다.
예를 들어
<name>Kim</name>
을 읽으면
startElement()
↓
characters()
↓
endElement()
순서대로 호출된다.
개발자는 이벤트가 발생했을 때 필요한 작업을 수행하면 된다.
SAX Parser는 이벤트가 발생했을 때 실행할 코드를 Handler에 작성한다.
대표적인 메서드는 다음과 같다.
startElement()
characters()
endElement()
각 메서드가 호출될 때 원하는 데이터를 저장하면 된다.
Java에서는 XML 데이터를 저장하기 위해 Record를 사용할 수도 있다.
Record는 데이터를 저장하기 위한 불변 객체이다.
public record Person(
String name,
int age
) {}
Record의 특징은 다음과 같다.
DTO(Data Transfer Object)를 만들 때 매우 유용하다.
DOM(Document Object Model)은 XML 문서를 전부 메모리에 읽은 후 트리 구조를 생성한다.
XML
↓
메모리에 전체 저장
↓
트리 생성
↓
원하는 노드 탐색
즉,
탐색은 편하지만 무겁다.
DOM에서는 XML을 모두 Node로 관리한다.
예를 들어
<person>
<name>Kim</name>
</person>
은 다음과 같은 트리 구조가 된다.
person
└── name
└── Kim
태그, 속성, 값 모두 Node로 관리된다.
| 구분 | SAX | DOM |
|---|---|---|
| 읽는 방식 | 순차적으로 읽음 | 전체를 메모리에 로드 |
| 메모리 사용 | 적음 | 많음 |
| 속도 | 빠름 | 느림 |
| 탐색 | 어려움 | 자유로움 |
| 수정 | 불가능 | 가능 |
| 대용량 처리 | 유리 | 불리 |
간단히 기억하면
SAX는 빠르고 가볍고, DOM은 무겁지만 자유롭다.
JSON(JavaScript Object Notation)은 현재 가장 많이 사용되는 데이터 교환 형식이다.
사람이 읽기 쉽고 용량도 작으며 대부분의 프로그래밍 언어에서 사용할 수 있다.
대표적인 형태는 다음과 같다.
{
"name": "Kim",
"age": 20,
"major": "Computer"
}
객체는 Key-Value 형태로 구성된다.
JSON은 배열도 표현할 수 있다.
{
"students": [
{
"name": "Kim"
},
{
"name": "Lee"
}
]
}
JSON이 널리 사용되는 이유는 다음과 같다.
현재 REST API에서는 거의 JSON을 사용한다고 생각해도 될 정도이다.
| 항목 | XML | JSON |
|---|---|---|
| 문법 | 태그 기반 | Key-Value 기반 |
| 가독성 | 복잡한 편 | 간결함 |
| 용량 | 크다 | 작다 |
| 속도 | 느린 편 | 빠른 편 |
| 계층 구조 | 가능 | 가능 |
| 현재 활용도 | 공공기관, 레거시 시스템 | 대부분의 REST API |
최근에는 대부분 JSON을 사용하지만,
공공데이터나 오래된 시스템에서는 XML도 자주 사용되므로 두 형식을 모두 이해하고 있어야 한다.
이번 글에서는 Java에서 사용하는 XML과 JSON의 구조와 XML Parser를 정리했다.