[Java] 44. Web Spring framework의 view에서 사용하는 언어(JSTL) - XML


Study/Java  2021. 6. 10. 13:58

안녕하세요. 명월입니다.


이 글은 Web Spring framework의 view에서 사용하는 언어(JSTL) - XML에 대한 글입니다.


이전 글에서 JSTL 언어의 코어, 포멧팅, 함수, 데이터베이스에 관해서 설명했습니다.

XML처리는 html 파일에서 다른 xml 파일의 데이터를 추출하여 사용하는 라이브러리입니다.

최근에는 ajax나 방식으로 json타입의 데이터를 통신하는 방법을 더 자주 사용하고 그의 관한 라이브러리도 많고 사용면에서도 훨씬 편하기 때문에 이 xml 파일을 자주 사용하지는 않습니다.

그러나 지역화(Localization)나 메시지 데이터 취득하기 위해서 사용하는 경우도 있으니 알아두는 편이 좋습니다.

XML 라이브러리

먼저 XML 라이브러리를 사용하기 위해서는 pom.xml에 라이브러리를 추가하여야 합니다.

<!-- https://mvnrepository.com/artifact/xalan/xalan -->
<dependency>
  <groupId>xalan</groupId>
  <artifactId>xalan</artifactId>
  <version>2.7.1</version>
</dependency>

그리고 xml 파일 하나를 생성해서 예제로 다루겠습니다.

<?xml version="1.0" encoding="UTF-8"?>
<data>
  <title>Hello world</title>
  <persons>
    <student>
      <name>Mary</name>
      <age>12</age>
      <class>5</class>
    </student>
    <student>
      <name>John</name>
      <age>13</age>
      <class>6</class>
    </student>
  </persons>
</data>

여기서 이 xml 파일의 경로는 웹 브라우져 상태의 경로가 아닌 서버 측의 디렉토리 경로입니다.

왜냐하면 view의 파일은 서버 측에서 controller의 데이터와 view의 JSTL 언어의 파일의 데이터를 결합하여 최종 html이 웹 브라우져로 응답하는 것이기 때문에 JSTL은 브라우져 측의 경로가 아닌 서버 측의 경로를 생각해서 작성해야 합니다.

XML 파싱과 출력 <x:parse />, <x:out />

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- 코어 라이브러리 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!-- XML 라이브러리 -->
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml"%>
<!-- HTML 태그 시작 -->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
  </head>
  <body>
    <!-- xml 파일 읽어오기 -->
    <c:import var="xmlDoc" url="data.xml"/>
    <!-- xml 데이터 파싱 -->
    <x:parse var="parsedDocument" xml="${xmlDoc}"/>
    <!-- xpath 주소의 xml 데이터의 data 태그 안의 title 데이터 출력 -->
    <x:out select="$parsedDocument/data/title" />
  </body>
</html>

XML 데이터 반복 <x:forEach />

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- 코어 라이브러리 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!-- XML 라이브러리 -->
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml"%>
<!-- HTML 태그 시작 -->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
  </head>
  <body>
    <!-- xml 파일 읽어오기 -->
    <c:import var="xmlDoc" url="data.xml"/>
    <!-- xml 데이터 파싱 -->
    <x:parse var="parsedDocument" xml="${xmlDoc}"/>
    <!-- data 태그의 persons 태그의 student 태그를 반복 -->
    <x:forEach select="$parsedDocument/data/persons/student">
      <p>
        <!-- student 태그의 name 태그 -->
        <x:out select="name" />
        <!-- student 태그의 name 태그 -->
        <x:out select="age" />
        <!-- student 태그의 class태그 -->
        <x:out select="class" />
      </p>
    </x:forEach>
  </body>
</html>

XML 데이터를 변수로 치환 <x:set />

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- 코어 라이브러리 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!-- XML 라이브러리 -->
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml"%>
<!-- HTML 태그 시작 -->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
  </head>
  <body>
    <!-- xml 파일 읽어오기 -->
    <c:import var="xmlDoc" url="data.xml"/>
    <!-- xml 데이터 파싱 -->
    <x:parse var="parsedDocument" xml="${xmlDoc}"/>
    <!-- xpath 주소의 xml 데이터의 data 태그 안의 title 데이터를 title 변수로 저장 -->
    <x:set select="$parsedDocument/data/title" var="title"/>
    <!-- 데이터 출력 -->
    <x:out select="$title" />
  </body>
</html>

XML 데이터의 분기문 <x:if />

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- 코어 라이브러리 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!-- XML 라이브러리 -->
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml"%>
<!-- HTML 태그 시작 -->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
  </head>
  <body>
    <!-- xml 파일 읽어오기 -->
    <c:import var="xmlDoc" url="data.xml"/>
    <!-- xml 데이터 파싱 -->
    <x:parse var="parsedDocument" xml="${xmlDoc}"/>
    <!-- xpath 주소의 xml 데이터의 persons의 student 두번째 나이는 13살 -->
    <x:if select="$parsedDocument/data/persons/student[2]/age = 13">
      <!-- 출력 -->
      John is 13 years old.
    </x:if>
  </body>
</html>

XML 데이터의 분기문 <x:choise />, <x:when />, <x:otherwise />

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- 코어 라이브러리 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!-- XML 라이브러리 -->
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml"%>
<!-- HTML 태그 시작 -->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
  </head>
  <body>
    <!-- xml 파일 읽어오기 -->
    <c:import var="xmlDoc" url="data.xml"/>
    <!-- xml 데이터 파싱 -->
    <x:parse var="parsedDocument" xml="${xmlDoc}"/>
    <!-- 분기문 -->
    <x:choose>
      <!-- xpath 주소의 xml 데이터의 persons의 student 두번째 나이는 13살 -->
      <x:when select="$parsedDocument/data/persons/student[2]/age = 13">
        <!-- 출력 -->
        John is 13 years old.
      </x:when>
      <!-- xpath 주소의 xml 데이터의 persons의 student 두번째 나이는 12살 -->
      <x:when select="$parsedDocument/data/persons/student[2]/age = 12">
        <!-- 출력 -->
        John is 12 years old.
      </x:when>
      <!-- 그밖의 -->
      <x:otherwise>
        I don't know how old John is.
      </x:otherwise>
    </x:choose>
  </body>
</html>

XSL 파일과 결합<x:transform />, <x:param />

XSL파일이란 XML 스타일 시트 파일이라고 생각하면 됩니다. (eXtensible Stylesheet Language)

즉, XML 구조와 XSL 파일을 결합해서 하나의 HTML 파일을 만들어 내는 것입니다.

CSS를 사용하면 굳이 XML 구조와 XSL 파일을 결합해서 하나의 스타일된 시트를 만들 필요가 없어 보입니다.

하지만 CSS는 구조적인 정의까지는 아무래도 힘들기 때문에 같은 구조의 같은 스타일로 데이터에 따른 많은 페이지를 반복적으로 만들때 유용합니다. 예를 들면 블로그처럼 글이나 데이터는 다르고 같은 형식의 페이지를 다량 생산할 때 유용합니다.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <!-- 출력 형태 -->
  <xsl:output method="html" indent="yes" />
  <!-- 파리미터 설정 -->
  <xsl:param name="bgColor" />
  <!-- 파싱하는 템플릿 -->
  <xsl:template match="/">
    <html>
      <head>
        <meta charset="UTF-8" />
        <title>Insert title here</title>
      </head>
      <body>
        <xsl:apply-templates />
      </body>
    </html>
  </xsl:template>
  <!-- XML 데이터의 books 태그 -->
  <xsl:template match="books">
    <!-- 여기서 파라미터 특징은 ${}가 아닌 {$}의 형태 -->
    <table border="1" width="100%" bgColor="{$bgColor}">
      <xsl:for-each select="book">
        <tr>
          <td>
            <b>
              <!-- xml의 books의 book의 name 데이터 -->
              <xsl:value-of select="name" />
            </b>
          </td>
          <td>
            <!-- xml의 books의 book의 author 데이터 -->
            <xsl:value-of select="author" />
          </td>
          <td>
            <!-- xml의 books의 book의 price 데이터 -->
            <xsl:value-of select="price" />
          </td>
        </tr>
      </xsl:for-each>
    </table>
  </xsl:template>
</xsl:stylesheet> 
<?xml version="1.0" encoding="UTF-8"?>
<books>
  <book>
    <name>C#</name>
    <author>nowonbun</author>
    <price>200</price>
  </book>
  <book>
    <name>JAVA</name>
    <author>nowonbun</author>
    <price>1000</price>
  </book>
  <book>
    <name>PHP</name>
    <author>nowonbun</author>
    <price>500</price>
  </book>
</books>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- 코어 라이브러리 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!-- XML 라이브러리 -->
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml"%>
<!-- xml 파일 설정 -->
<c:import var="xml" url="data.xml"/>
<!-- xsl 파일 설정 -->
<c:import var="xsl" url="data.xsl"/>  
<!-- xml과 xsl를 결합 -->
<x:transform xml="${xml}" xslt="${xsl}">  
  <!-- 파라미터 설정 -->
  <x:param name="bgColor" value="yellow"/>  
</x:transform> 

보통 관리용의 웹 서비스에서는 아마 XML를 파싱해서 사용하는 경우는 없을 것 같습니다.

그러나 블로그나 불특정 다수에거 게시하는 웹 프로그램이라면 고정된 구조에 따라서 데이터만 바꾸고 게시하게 됩니다.

그리고 Javascript를 통해 비동기로 데이터를 취득하여 설정하게 되면 구글봇에는 인식이 되지 않기 때문에 Google이나 Naver의 검색 엔진에는 내용을 인식하지 못하여 검색 결과에 나오지 않을 수도 있습니다.

그럴 경우에는 이런 XML파싱 형식으로 작성하는 방법이 좋을 것 같네요


여기까지 Web Spring framework의 view에서 사용하는 언어(JSTL) - XML에 대한 글이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.