
자바(Java) 프로젝트를 진행하다 보면 Jackson이나 GSON 같은 외부 라이브러리를 사용하는 것이 당연하게 느껴지곤 합니다. 하지만 보안상의 이유로 외부 라이브러리 반입이 제한된 환경이거나, 아주 가벼운 마이크로서비스를 구축해야 한다면 어떨까요? "순수 자바(Pure Java)만으로 데이터 파싱이 가능한가?"라는 질문에 대한 답은 "YES"입니다. 심지어 XML의 경우 자바 표준 스펙 내에 강력한 도구가 이미 포함되어 있습니다.
1. XML 파싱: 자바 표준의 강력한 기본기 (JAXP)
XML은 자바의 역사와 궤를 같이해왔습니다. 자바는 JAXP(Java API for XML Processing)를 통해 외부 라이브러리 없이도 DOM, SAX, StAX 세 가지 방식의 파싱을 완벽하게 지원합니다. 별도의 설정 없이 javax.xml.parsers 패키지를 사용하는 것만으로도 충분합니다.
- DOM (Document Object Model): 전체 문서를 메모리에 로드하여 트리 구조로 관리합니다. 직관적이지만 메모리 소모가 큽니다.
- SAX (Simple API for XML): 이벤트 기반으로 문서를 순차적으로 읽습니다. 메모리 효율이 극도로 높지만 제어가 까다롭습니다.
- StAX (Streaming API for XML): 커서 기반의 풀(Pull) 파싱 방식으로, SAX의 효율성과 DOM의 사용성을 절충한 현대적인 방식입니다.
2. JSON 파싱: Java 11 이후의 변화와 현실적인 대안
안타깝게도 자바 표준 라이브러리(JDK) 자체에는 org.json이나 Jackson처럼 JSON을 직접 객체로 매핑해주는 클래스가 포함되어 있지 않습니다. 하지만 방법이 없는 것은 아닙니다.
- Java 11+ HttpClient 활용: Java 11에 도입된
java.net.http.HttpClient는 비동기 통신을 지원하며, 응답 본문을 문자열로 받아 로직 내에서 처리하기 용이해졌습니다. - 문자열 조작 및 정규식: 구조가 단순한 JSON이라면 정규표현식이나
String.split(),StringTokenizer를 활용해 파싱 로직을 직접 구현할 수 있습니다. - Nashorn Script Engine (Java 8~14): 자바 내에서 자바스크립트 엔진을 실행하여
JSON.parse()를 호출하는 트릭이 있었으나, 최신 JDK에서는 제거되었습니다.
3. XML vs JSON 파싱 방식 비교 (표준 API 기준)
| 항목 | XML (Standard) | JSON (Standard) |
|---|---|---|
| 표준 지원 여부 | 매우 높음 (JAXP 내장) | 공식 내장 API 없음 |
| 주요 패키지 | javax.xml.parsers, org.w3c.dom | java.util (문자열 처리 위주) |
| 복잡도 | 표준 API만으로 복잡한 구조 처리 가능 | 복잡한 구조는 직접 구현 시 난이도 상승 |
| 추천 방식 | DocumentBuilder (DOM) 사용 | String 메서드 또는 정규식 활용 |
4. 실전 코드 예제 (Sample Example)
방법 1: 외부 라이브러리 없는 XML 파싱 (DOM 방식)
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import java.io.ByteArrayInputStream;
public class NativeXmlParser {
public static void main(String[] args) throws Exception {
String xml = "<user><name>Gemini</name></user>";
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new ByteArrayInputStream(xml.getBytes()));
NodeList nameList = doc.getElementsByTagName("name");
System.out.println("User Name: " + nameList.item(0).getTextContent());
}
}
방법 2: 외부 라이브러리 없는 JSON 값 추출 (정규식 방식)
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class NativeJsonParser {
public static void main(String[] args) {
String json = "{\"status\":\"success\", \"code\":200}";
// 특정 키의 값을 추출하는 정규식 예시
Pattern pattern = Pattern.compile("\"status\"\\s*:\\s*\"([^\"]+)\"");
Matcher matcher = pattern.matcher(json);
if (matcher.find()) {
System.out.println("Status: " + matcher.group(1));
}
}
}
5. 결론: 언제 표준 API를 써야 하는가?
전문적인 개발 환경에서 외부 라이브러리를 배제하는 것은 효율성을 떨어뜨릴 수 있습니다. 그러나 시스템 환경의 제약이 크거나, 가벼운 유틸리티 클래스 하나를 위해 수 메가바이트의 라이브러리(Jar)를 추가하고 싶지 않을 때 자바 표준 API와 문자열 처리 기술은 훌륭한 무기가 됩니다. XML은 자바 표준 도구를 적극 활용하시고, JSON은 구조가 단순한 경우에만 직접 파싱을 고려하십시오. 구조가 복잡해진다면 표준은 아니더라도 신뢰할 수 있는 경량 라이브러리를 검토하는 것이 유지보수 측면에서 전문적인 선택입니다.
출처 및 참고문헌
- Java SE Documentation: JAXP (Java API for XML Processing)
- OpenJDK 11: java.net.http API Specification
- Effective Java (Joshua Bloch) - 라이브러리 활용의 원칙
'Language > Java' 카테고리의 다른 글
| [JAVA] 다중 catch 블록 작성 시 주의점 : 예외 상속 계층의 이해 (0) | 2026.01.20 |
|---|---|
| [JAVA] 자바 예외 계층 구조 완벽 가이드 : Checked와 Unchecked의 결정적 차이 (0) | 2026.01.20 |
| [JAVA] PrintStream vs PrintWriter : 당신의 출력 코드가 전문적인지 확인하는 법 (0) | 2026.01.20 |
| [JAVA] Scanner vs BufferedReader : 성능과 효율을 결정짓는 입력 방식의 모든 것 (0) | 2026.01.20 |
| [JAVA] Java 파일 입출력의 진화: Legacy File 클래스 vs Modern NIO.2 완벽 분석 (0) | 2026.01.20 |