레거시 프로젝트를 진행하면서 XSLT 기반 화면 렌더링을 처음 마주했던 경험이 있었다.
XML을 단순히 데이터 저장으로만 인지하고 있던 나는,
“이걸로 화면도 그리네?” 하며 굉장히 생소하고 흥미로웠다.
국내에서는 사용하는 예도 적고 자료가 많지 않아,
직접 DOM 구조를 보면서 XSLT와 HTML의 매핑 관계를 하나씩 파악해야 했다.
이 과정을 통해 “데이터와 화면을 이렇게 분리할 수도 있구나”라는 새로운 시각을 얻을 수 있었다.
이번 포스팅에서는 바로 그 경험을 바탕으로,
XSLT가 무엇인지, XML을 어떻게 HTML로 변환할 수 있는지 간단한 예제를 통해 정리해보려 한다.
XSLT란?
XSLT(Extensible Stylesheet Language Transformations)는
XML 데이터를 원하는 형태(HTML, 텍스트, 다른 XML 등)로 변환하기 위한 기술이다.
쉽게 말해서,
- XML = 데이터 원본
- XSLT = 변환 규칙
이라고 보면 된다.
즉, HTML을 직접 그리는 대신, XML에 담긴 데이터를 <xsl:for-each>, <xsl:value-of> 같은 태그로 꺼내와 출력한다.
XSLT 기본 문법
XSLT 문서는 보통 아래 구조로 시작한다.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- 변환 규칙 작성 -->
</xsl:stylesheet>
- <xsl:template match="/"> : XML 문서의 루트(/)에 대한 변환 규칙 정의
- <xsl:value-of select="노드명"/> : 특정 XML 노드의 값을 출력
- <xsl:for-each select="노드경로"> : 반복되는 XML 요소들을 순회하면서 HTML 태그로 변환
- <xsl:if test="조건"> : 조건문 처리 가능
변환 예제
예를 들어, 책 목록이 담긴 XML이 있다고 하자.

이 XML을 HTML 테이블로 변환하는 XSLT는 다음과 같다.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- 루트 매칭 -->
<xsl:template match="/">
<html>
<body>
<h2>책 목록</h2>
<table border="1" cellpadding="5">
<tr>
<th>제목</th>
<th>저자</th>
</tr>
<!-- books/book 반복 -->
<xsl:for-each select="books/book">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="author"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
XML 경로와 XSL의 경로를 넣고 JSP를 통해 변환하면
@Service
public class XslTransformService {
public String transformXmlWithXsl(String xmlPath, String xslPath) {
try {
// XSLT 변환기 생성
TransformerFactory factory = TransformerFactory.newInstance();
// XSLT 파일 로드
Source xslt = new StreamSource(new File(xslPath));
Transformer transformer = factory.newTransformer(xslt);
// XML 파일 로드
Source xml = new StreamSource(new File(xmlPath));
// 변환 결과를 문자열로 저장
StringWriter writer = new StringWriter();
transformer.transform(xml, new StreamResult(writer));
return writer.toString();
} catch (Exception e) {
throw new RuntimeException("XSL 변환 중 오류 발생", e);
}
}
}
<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
<title>XSLT Demo</title>
</head>
<body>
<h2>XML → XSL 변환 결과</h2>
<div>
${resultHtml}
</div>
</body>
</html>
변환 결과
위 XML + XSLT를 적용하면 브라우저에서 이렇게 출력된다.

이렇게 화면이 구성되는걸 알수있다.
정리
XSLT는 흔히 접하기 힘든 기술이지만, XML 데이터를 화면에 바로 렌더링할 수 있다는 장점이 있다.
레거시 프로젝트에서 처음 마주했을 때는 불편함도 많았지만,
“데이터와 화면을 이런 식으로 분리할 수도 있구나” 하는 새로운 시각을 얻을 수 있었다.
물론 지금은 React, Vue 같은 프론트엔드 프레임워크나 JSON 기반 API가 대세라 잘 쓰이지는 않는다.
그래도 레거시를 다루다 보면 예상치 못하게 마주칠 수 있는 기술이라,
“아, 이런 방식도 있구나” 하고 참고가 된다면 충분히 의미가 있을 것 같다.
참고자료
XSL Transformations (XSLT) Version 2.0 (Second Edition)
1 Introduction 1.1 What is XSLT? This specification defines the syntax and semantics of the XSLT 2.0 language. [Definition: A transformation in the XSLT language is expressed in the form of a stylesheet, whose syntax is well-formed XML [XML 1.0] conformin
www.w3.org
'Java > 기술회고' 카테고리의 다른 글
| Kafka Consumer Lag 600을 0으로 만든 방법 (k6 + Prometheus +Grafana) (0) | 2026.01.28 |
|---|---|
| Thread.sleep()은 왜 위험할까? Kafka DLQ로 안전하게 재시도 처리하기 (0) | 2025.12.15 |
| 로컬에서 Spring Boot 서버 2개 띄워 HAProxy로 트래픽 분산해보기 (0) | 2025.10.26 |
| Kafka 기반 실시간 경매 시스템 부하 테스트 및 병목 개선 (k6 + Prometheus + Grafana) (0) | 2025.10.18 |
| Copilot + JUnit 테스트 코드 자동 생성 환경 구성 (0) | 2025.10.16 |