[Java] 43. Web Spring framework의 view에서 사용하는 언어(JSTL) - 함수, 데이터베이스


Study/Java  2021. 6. 9. 15:25

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


이 글은 Web Spring framework의 view에서 사용하는 언어(JSTL) - 함수, 데이터베이스에 대한 글입니다.


이전 글에서 JSTL 언어의 코어와 포멧팅 라이브러리에 대해서 설명했습니다.

코어는 JSTL에서 가장 자주 사용하는 라이브러리이고 포멧팅도 최근에는 moment 자바스크립트 라이브러리가 있어서 예전만큼 자주 사용하지는 않지만 자주 사용하는 라이브러리 중에 하나입니다.

여기서 사용하는 함수 라이브러리는 문자에 관한 라이브러리입니다만 보통 문자 처리에 관해서는 JSP 파일에서 처리하는 것보다는 보통 서버쪽, Controller 측에서 처리한 후 결과만 보여주는 것이 보통입니다.

물론 데이터베이스 라이브러리도 JSP 파일에서 처리하기 보다는 Controller 측에서 처리하는게 보통입니다.

즉, 최근에는 자주 사용하는 라이브러리는 아닙니다. 그러나 예전에는 자주 사용하던 라이브러리이고 사양에 따라 사용할 수 있기 때문에 간단하게 설명하겠습니다.

함수 라이브러리

코어와 포멧팅에서는 JSTL를 태그 형식으로 사용했습니다. 그러나 함수 라이브러리는 값을 표현하는 방식 달러와 중괄호(${데이터}) 형식으로 사용하게 됩니다.

문자 포함 여부 fn:contains(string, sbustring)

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- 코어 라이브러리 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!-- 함수 라이브러리 -->
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<!-- HTML 태그 시작 -->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
  </head>
  <body>
    <!-- 변수 선언 -->
    <c:set var="name" value="hello world"/>
    <!-- 변수 name에 world가 포함 되어 있으면 true -->
    <c:if test="${fn:contains(name, 'world')}">
      <!-- 화면 출력 -->
      Hello world
    </c:if>
  </body>
</html>

문자 포함 여부(대소문자 무시) fn:containsIgnoreCase(string, sbustring)

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- 코어 라이브러리 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!-- 함수 라이브러리 -->
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<!-- HTML 태그 시작 -->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
  </head>
  <body>
    <!-- 변수 선언 -->
    <c:set var="name" value="hello world"/>
    <!-- 변수 name에 WORLD가 대소문자 관계 없이 포함 되어 있으면 true -->
    <c:if test="${fn:containsIgnoreCase(name, 'WORLD')}">
      <!-- 화면 출력 -->
      Hello world
    </c:if>
  </body>
</html>

문자열이 prefix로 시작하는 여부 fn:startsWith(string, prefix)

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- 코어 라이브러리 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!-- 함수 라이브러리 -->
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<!-- HTML 태그 시작 -->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
  </head>
  <body>
    <!-- 변수 선언 -->
    <c:set var="name" value="hello world"/>
    <!-- 변수 name에 문자가 hello로 시작하는 경우 true -->
    <c:if test="${fn:startsWith(name, 'hello')}">
      <!-- 화면 출력 -->
      Hello world
    </c:if>
  </body>
</html>

문자열이 suffix로 끝나는 여부 fn:endsWith(string, suffix)

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- 코어 라이브러리 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!-- 함수 라이브러리 -->
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<!-- HTML 태그 시작 -->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
  </head>
  <body>
    <!-- 변수 선언 -->
    <c:set var="name" value="hello world"/>
    <!-- 변수 name에 문자가 rld로 끝나는 경우 true -->
    <c:if test="${fn:endsWith(name, 'rld')}">
      <!-- 화면 출력 -->
      Hello world
    </c:if>
  </body>
</html>

특수문자(<, >, &, ', ")를 xml 엔티티 코드(&lt;, &gt;, &, &#039, &#034)로 변환 fn:escapeXml(string)

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- 코어 라이브러리 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!-- 함수 라이브러리 -->
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<!-- HTML 태그 시작 -->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
  </head>
  <body>
    <!-- 변수 선언 -->
    <c:set var="name" value="< , > , & , ' , \" " />
    <!-- 변수 name에 문자 변환 -->
	${fn:escapeXml(name)}
  </body>
</html>

일치되는 문자열 인덱스 fn:indexOf(string, sbustring)

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- 코어 라이브러리 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!-- 함수 라이브러리 -->
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<!-- HTML 태그 시작 -->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
  </head>
  <body>
    <!-- 변수 선언 -->
    <c:set var="name" value="hello world"/>
    <!-- world 단어의 위치 반환 -->
    ${fn:indexOf(name, "world")}
  </body>
</html>

문자열을 separator의 문자에 따라 배열로 분리 fn:split(string, separator)

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- 코어 라이브러리 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!-- 함수 라이브러리 -->
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<!-- HTML 태그 시작 -->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
  </head>
  <body>
    <!-- 변수 선언 -->
    <c:set var="name" value="hello,world,good"/>
    <!-- name 변수를 ,를 구분으로 배열로 분리 -->
    <c:set var="arr" value="${fn:split(name,',')}"/>
    <!-- 배열 형식이니 반복분으로 출력 -->
    <c:forEach var="ret" items="${arr}">
    <!-- 화면 출력 -->
      ${ret} <br />
    </c:forEach>
  </body>
</html>

배열을 separator의 문자로 결합 fn:join(array, separator)

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- 코어 라이브러리 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!-- 함수 라이브러리 -->
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<!-- HTML 태그 시작 -->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
  </head>
  <body>
    <!-- 변수 선언 -->
    <c:set var="name" value="hello,world,good"/>
    <!-- name 변수를 ,를 구분으로 배열로 분리 -->
    <c:set var="arr" value="${fn:split(name,',')}"/>
    <!-- 배열 arr을 ***로 결합  -->
    <c:set var="join" value="${fn:join(arr,'***')}"/>
    <!-- 화면 출력 -->
    ${join}
  </body>
</html>

문자열 길이 변환 fn:length(string)

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- 코어 라이브러리 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!-- 함수 라이브러리 -->
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<!-- HTML 태그 시작 -->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
  </head>
  <body>
    <!-- 변수 선언 -->
    <c:set var="name" value="hello world"/>
    <!-- 길이 출력 -->
    ${fn:length(name)}
  </body>
</html>

string 문자열 내에서 before 문자열을 after 문자열로 변환 fn:replace(string, before, after)

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- 코어 라이브러리 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!-- 함수 라이브러리 -->
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<!-- HTML 태그 시작 -->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
  </head>
  <body>
    <!-- 변수 선언 -->
    <c:set var="name" value="hello world"/>
    <!-- 문자열 world를 home으로 변환하여 출력 -->
    ${fn:replace(name,"world", "home")}
  </body>
</html>

string 문자열을 before부터 after 까지 자르기 fn:substring(string, before, after)

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- 코어 라이브러리 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!-- 함수 라이브러리 -->
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<!-- HTML 태그 시작 -->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
  </head>
  <body>
    <!-- 변수 선언 -->
    <c:set var="name" value="hello world"/>
    <!-- 문자열 world를 6글자부터 8까지 출력 -->
    ${fn:substring(name,6,8)}
  </body>
</html>

string 문자열의 sbustring 이후의 문자를 반환 fn:substringAfter(string, sbustring)

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- 코어 라이브러리 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!-- 함수 라이브러리 -->
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<!-- HTML 태그 시작 -->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
  </head>
  <body>
    <!-- 변수 선언 -->
    <c:set var="name" value="hello world"/>
    <!-- 문자열 wo이후 문자열로 출력 -->
    ${fn:substringAfter(name,"wo")}
  </body>
</html>

string 문자열의 sbustring 이전의 문자를 반환 fn:substringBefore(string, sbustring)

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- 코어 라이브러리 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!-- 함수 라이브러리 -->
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<!-- HTML 태그 시작 -->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
  </head>
  <body>
    <!-- 변수 선언 -->
    <c:set var="name" value="hello world"/>
    <!-- 문자열 wo 이전 문자열로 출력 -->
    ${fn:substringBefore(name,"wo")}
  </body>
</html>

문자열을 소문자로 변환 fn:toLowerCase(string)

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- 코어 라이브러리 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!-- 함수 라이브러리 -->
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<!-- HTML 태그 시작 -->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
  </head>
  <body>
    <!-- 변수 선언 -->
    <c:set var="name" value="HELLO WORLD"/>
    <!-- 소문자로 변환 출력 -->
	${fn:toLowerCase(name)}
  </body>
</html>

문자열을 대문자로 변환 fn:toUpperCase(string)

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- 코어 라이브러리 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!-- 함수 라이브러리 -->
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<!-- HTML 태그 시작 -->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
  </head>
  <body>
    <!-- 변수 선언 -->
    <c:set var="name" value="hello world"/>
    <!-- 대문자로 변환 출력 -->
	${fn:toUpperCase(name)}
  </body>
</html>

문자열의 앞뒤 공백을 제거 fn:trim(string)

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- 코어 라이브러리 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!-- 함수 라이브러리 -->
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<!-- HTML 태그 시작 -->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
  </head>
  <body>
    <!-- 변수 선언 -->
    <c:set var="name" value="   hello world    "/>
    <!-- 공백 제거 -->
    ${fn:trim(name)}
  </body>
</html>

데이터베이스 라이브러리

보통 데이터베이스 접속은 JSP 파일에서 이루어지는 것이 아니고 Controller의 Java파일에서 접속하고 데이터를 처리하고 view로 출력하는 형태가 기본적입니다. 즉, 이 데이터베이스 라이브러리는 사실 거의 사용할 일이 없는 라이브러리입니다.

그래도 지역화(localization)나 메시지 데이터를 취득을 위해서 간혹 처리하는 경우도 있으니 알아두는 편이 좋습니다.


JSTL에서 데이터베이스를 사용하기 위해서는 일단 db connector가 필요합니다.

저는 mysql로 예제를 확인하겠습니다.

<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.41</version>
</dependency>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- 코어 라이브러리 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!-- 데이터베이스 라이브러리 -->
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%>
<!-- HTML 태그 시작 -->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
  </head>
  <body>
    <!-- 커넥션 연결 태그 -->
    <sql:setDataSource url="jdbc:mysql://localhost:3306/test" driver="com.mysql.jdbc.Driver" user="id" password="pw" var="ds" scope="application" />
    <!-- 쿼리 태그 dataSource는 sql:setDataSource의 변수-->
    <sql:query var="rs" scope="page" dataSource="${ds}" maxRows="10" startRow="0">
      select * from datatest where idx=?
      <sql:param value="1" />
      <!-- 파라미터 설정 -->
    </sql:query>
    <table>
      <tr>
        <!-- 결과 컬럼 수만큼 반복-->
        <c:forEach var="columnName" items="${rs.columnNames}">
          <!-- 컬럼명을 출력 -->
          <td><c:out value="${columnName}" /></td>
        </c:forEach>
      </tr>
      <!-- 데이터의 결과 수만큼 반복 -->
      <c:forEach var="row" items="${rs.rowsByIndex}">
        <tr>
          <!-- 컬럼 수 만큼 결과 반복 -->
          <c:forEach var="columnValue" items="${row}">
            <td><c:out value="${columnValue}" /></td>
          </c:forEach>
        </tr>
      </c:forEach>
    </table>
  </body>
</html>

다음 글에서는 JSTL의 XML 라이브러리를 정리하겠습니다.


여기까지 Web Spring framework의 view에서 사용하는 언어(JSTL) - 함수, 데이터베이스에 대한 글이었습니다.


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