[Spring / Legacy /

Spring Legacy 프로젝트에서는 템플릿 엔진으로 JSP를 주로 사용하고, 서버측에서 받은 데이터를 소비하기 위해 EL과 JSTL을 사용한다. 주로 코어와 기능을 사용하며 접두어는 각각 c와 fn으로 등록하고 날짜는 그리고 표시됩니다.

하지만 자바에서 제공하는 기능을 JSP에서 사용하고 싶은데 JSTL에서는 제공되지 않아 어려움을 겪었다. 예를 들어 Java 컬렉션 중 List는 contains 기능을 제공하지만 JSTL은 제공하지 않으므로 횡단하고 그들을 찾는 데 사용됩니다.

그러다가 갑자기 모델 1의 방법을 사용하여 JSP에서 직접 Java 코드를 작성하고 있었고 방법이 있을 수 있다고 생각했습니다. 그래서 검색하다가 Custom Tag라는 기능을 알게 되었고 JSTL도 Custom Tag의 일종이라는 것을 알게 되었습니다.

Custom Tag를 구현하는 방법을 찾아봤지만 대부분의 자료가 오래된 자료라 프로젝트의 현재 상태에 맞는 방법을 찾기가 어려웠습니다. 다행히 구현이 되어서 그 방법을 공유하고자 합니다.

728×90

( 해결 )

1. JSP 버전 확인

먼저 JSP 버전을 확인해야 합니다. 이미 구현된 프로젝트의 JSP 파일에 다음 코드를 추가하면 됩니다.

<%= JspFactory.getDefaultFactory().getEngineInfo().getSpecificationVersion() %>

이후 사이드 스크린이나 개발자 도구를 이용하여 출력되는 것을 보면 버전을 확인할 수 있습니다.


저의 경우 개발자 도구를 이용하여 2.3 버전임을 확인할 수 있었습니다.

2. 자바 클래스 작성

이제 본격적으로 함수를 구현해 보겠습니다 먼저 원하는 함수를 Java 클래스로 작성해야 합니다. 예를 들어 위에서 설명한 List의 contains 메소드를 JSP에서 사용할 수 있도록 구현해 보자.

package com.example.custom;

import java.util.List;

public class CustomFunctions {
    public static boolean contains(List<Object> list, Object o) {
        return list.contains(o);
    }
}

클래스 이름은 원하는 방식으로 작성할 수 있으며 기억해야 합니다. 여기에는 구글링하면서 본 클래스명을 CustomFunctions로 넣었습니다. 그리고 contains 메소드는 이미 Java로 구현된 List Collection의 contains 메소드를 사용하여 생성되었습니다.

3. tld 파일 작성

tld 파일에 대한 자세한 내용은 구글링을 통해 알 수 있지만 단순히 JSP에서 사용하는 태그에 대한 구성 파일인 Tag Library Descriptor의 약어일 뿐입니다.

따라서 생성된 Java 클래스를 JSP 태그로 사용하려면 여기에서 구성해야 합니다.

이때 TLD 파일의 JSP 태그 라이브러리 버전은 JSP 버전과 호환되도록 설정해야 하므로 사전에 JSP 버전을 확인하였다.

문제는 JSP는 버전 2.3이지만 JSP 태그 라이브러리는 버전 2.3이 아니라는 것입니다. 그래서 마지막으로 나온 버전이 2.1이라 2.1버전으로 작성했는데 다행히 잘 되네요.

경로는 WEB-INF 폴더 아래에 설정하면 됩니다. WEB-INF의 하위 폴더를 만들어 그 안에 넣거나 WEB-INF 바로 아래에 파일을 만들 수 있습니다. 나중에 사용할 JSP에서 경로를 올바르게 지정하기만 하면 됩니다.

– TLD 파일 작성 방법 –

(하나) tld 파일은 아래의 잘 작성된 다른 블로거의 블로그 게시물을 참조하여 작성할 수 있습니다. 특히 1.2, 2.0 버전을 다루고 있기 때문에 이전 버전의 JSP를 사용하시면 좋을 것 같습니다.

(Servlet/JSP) TLD(Tag Library Descriptor)란? TLD 파일을 작성하는 방법

관련 기사(서블릿/JSP) 사용자 정의 JSP 태그란 무엇입니까? JSP 2.0을 사용하여 태그를 생성하려면 SimpleTagSupport(Servlet/JSP) 버전 JSP 1.2 사용자 정의 태그 생성 TLD(Tag Library Descriptor) JSP에서 사용할 태그 라이브러리 설명자(줄여서 tld)

dolorak.tistory.com

(2) 이렇게 하는 것이 번거롭다면 빈 파일을 만들고 다음 코드를 작성하여 직접 만들 수 있습니다. XML 파일을 작성하는 것과 같다고 생각하십시오.

<%-- custom-functions.tld 파일(이 줄은 작성 X, 주석임) -->

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xml="http://www.w3.org/XML/1998/namespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd ">
  <tlib-version>2.1</tlib-version>
  <short-name>custom-functions</short-name>
  <function>
  	<name>contains</name>
  	<function-class>com.example.custom.CustomFunctions</function-class>
  	<function-signature>boolean contains(java.util.List, java.lang.Object)</function-signature>
  </function>
</taglib>

내용을 요약하자면 먼저 taglib 루트에 web-jsptaglibrary 2.1 버전을 설정합니다.

이 경우 항상 tlib-version 및 short-name 태그를 설정해야 하는데, tlib-version은 taglib 버전을 그대로 작성했고 short-name은 tld 파일명과 동일하게 작성되었습니다.

이제 여기에 함수 태그를 추가하여 생성한 Java 클래스 메서드를 연결합니다.

함수 태그에 쓸 수 있는 태그는 다양하지만 여기서는 세 가지 중 아무 태그나 쓸 수 있습니다.

name은 JSP에서 사용할 메소드의 이름이고, function class는 생성된 Java 클래스의 패키지를 포함하는 전체 경로이며, function signature는 형식에 따라 Java 클래스에 작성된 메소드입니다.

이렇게 하면 원래 tld 파일의 존재를 감지하기 위해 web.xml에 등록해야 했던 tld 파일이 완성되지만 버전이 진행됨에 따라 이 부분은 이제 삭제된 것으로 보입니다.

반응형


4. 이제 JSP에서 사용할 수 있습니다.

이제 JSP에서 만든 메서드를 사용할 수 있습니다.

<%-- JSP -->
<%-- JSTL -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%-- CUSTOM -->
<%@ taglib uri="/WEB-INF/custom-functions.tld" prefix="cfn" %>

<c:forEach var="student" items="${studentList}">
    <c:if test="${fn:length(subjectList) gt 0}">
        <c:forEach var="subject" items="${subjectList}">
            <c:if test="${cfn:contains(student.applicationSubjectIdList, subject.id)}">
                <p>${subject.name}</p>
            </c:if>
        </c:forEach>
    </c:if>
</c:forEach>

JSTL과 마찬가지로 경로만 잘 지정하면 바로 사용할 수 있습니다.

위의 코드는 예제 코드로 서버로부터 학생 목록과 과목 목록을 각각 studentList와 subjectList로 받아 수강생이 등록한 교과목에 중복 여부를 고려하지 않고 과목명을 출력하면 다음과 같이 작성할 수 있다.

이렇게 하면 JSP에서도 사용하려는 Java 메서드를 자유롭게 사용할 수 있습니다!

이것이 도움이 되길 바랍니다. 한 번의 클릭과 한 번의 댓글은 어딘가에 누군가에게 정말 도움이 됩니다. ‍