728x90
xml 형태이지만 문자열로 저장된 코드에서 원하는 값을 파싱해 사용해야하는 상황이 발생했다.
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new InputSource(new StringReader(xml.toString())));
document.getDocumentElement().normalize();
NodeList tagList = document.getElementsByTagName("trkpt");
Java의 표준 XML 파싱 API인 DOM (Document Object Model) Parser를 사용하여 XML 문서를 파싱하기 위한 DocumentBuilderFactory 인스턴스를 생성하는 코드입니다. 이를 단계별로 해석하면 다음과 같습니다.
- DocumentBuilderFactory
DocumentBuilderFactory는 XML 문서를 파싱하는 데 필요한 DocumentBuilder 객체를 생성하는 팩토리 클래스입니다.
XML을 파싱하려면 먼저 DocumentBuilderFactory를 통해 DocumentBuilder 객체를 얻어야 하며, 이를 통해 XML 문서를 Document 객체로 변환할 수 있습니다.
DocumentBuilderFactory는 추상 클래스이므로 직접 객체를 생성할 수 없고, 대신 팩토리 메서드인 newInstance()를 사용해 적절한 구현 객체를 반환받습니다. - newInstance()
DocumentBuilderFactory.newInstance()는 현재 환경에서 사용할 수 있는 XML 파서의 구체적인 구현을 반환하는 정적 팩토리 메서드입니다.
이 메서드는 자바 XML 파싱 라이브러리 내부에서 기본적으로 설정된 구현체 (예: Xerces)를 반환하거나, JVM의 환경 설정에 따라 다르게 동작할 수 있습니다.
전체 흐름
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
- 이를 통해 XML 파서를 위한 팩토리 객체를 준비하게 됩니다.이후 이 팩토리 객체를 사용하여 DocumentBuilder를 생성하고, XML 파일을 파싱해 Document 객체로 변환합니다. 그리고 DocumentBuilder는 XML 문서를 읽고, DOM 객체 트리로 변환하는 데 사용됩니다.
- builder.parse(...) 메서드는 주어진 XML 문자열을 파싱하여 Document 객체를 생성합니다. InputSource는 XML 데이터를 읽기 위한 소스이며, StringReader를 사용하여 문자열 형태의 XML 데이터를 제공합니다.
- normalize() 메서드는 문서의 구조를 정리하여 텍스트 노드의 통합 및 노드의 정규화를 수행합니다. 이를 통해 XML 문서의 구조가 일관되게 유지됩니다.
- getElementsByTagName("trkpt") 메서드는 XML 문서에서 모든 태그를 찾아 NodeList 형태로 반환합니다. 이 NodeList는 찾은 노드들을 포함하고 있으며, 이후 이 리스트를 통해 각 태그에 접근할 수 있습니다.
normalize() 메서드를 호출하지 않으면, XML 문서의 구조가 불완전할 수 있으며 다음과 같은 문제가 발생할 수 있습니다:
- 중복 텍스트 노드:
- 같은 부모 노드 아래에 있는 텍스트 노드가 여러 개 존재할 수 있습니다. 예를 들어, XML 요소 내에 연속된 텍스트 노드가 있을 경우, 이들 텍스트가 분리된 상태로 유지됩니다.
- DOM 트리의 불일치:
- XML 문서에서 요소가 중첩되어 있을 때, 노드 구조가 불일치하게 되어 DOM 트리 탐색 시 예기치 않은 결과를 초래할 수 있습니다.
- 탐색 및 검색의 어려움:
- DOM 트리를 탐색하거나 특정 노드를 찾을 때, 중복된 노드나 불완전한 구조로 인해 원하는 노드를 찾는 데 더 많은 복잡성이 생길 수 있습니다.
- 불필요한 복잡성:
- 코드가 복잡해지고, 오류가 발생할 가능성이 높아집니다. 데이터 처리 시 예기치 않은 동작이 발생할 수 있습니다.
결론적으로, normalize() 메서드를 호출하여 문서의 구조를 정리하면, XML 데이터를 일관성 있게 다룰 수 있어 코드의 안정성과 가독성이 향상됩니다.
'Dev > Spring Boot' 카테고리의 다른 글
[Spring Security] 스프링시큐리티의 기본 로그인을 사용하지 못했던 문제 (0) | 2024.10.27 |
---|---|
[JPA] 인덱싱을 통한 SELECT 성능 향상 (0) | 2024.10.22 |
Spring Boot JPA - BufferedReader로 CSV 파일을 읽어 DB에 저장하기 (1) | 2024.09.20 |
Spring Boot - RestClient 로 공공데이터 얻어오기 (0) | 2024.08.20 |
Spring 새로운 HTTP 클라이언트 - RestClient (0) | 2024.08.13 |