Aspectran JSP Tag Library는 Aspectran 프레임워크와 JSP 뷰 기술을 연동하여 표현식 평가, 다국어 메시지 처리, URL 생성, 환경별 컨텐츠 제어 등을 간편하게 처리할 수 있는 커스텀 태그 세트를 제공합니다.
1. 태그 라이브러리 선언
JSP 페이지 상단에 다음과 같이 선언하여 사용합니다.
<%@ taglib uri="http://aspectran.com/tags" prefix="aspectran" %>
2. 주요 태그 상세 안내
<aspectran:eval>
AsEL(Aspectran Expression Language)을 평가하고 결과를 출력하거나 변수에 할당합니다. AselExpressionPreprocessor가 적용되어 현대적인 연산자들을 모두 사용할 수 있습니다.
전처리기 지원 연산자
- Safe Navigation (
?.): 객체가null인지 확인하고 하위 속성에 접근합니다.<%-- user가 null이면 null 반환, 아니면 cart 접근 --%> <aspectran:eval expression="user?.cart?.numberOfItems"/> - Elvis Operator (
?:): 표현식 결과가null일 때 사용할 기본값을 지정합니다.<%-- 결과가 null이면 0 출력 --%> <aspectran:eval expression="user?.cart?.numberOfItems ?: 0"/> - Collection Selection (
.?[...]): 컬렉션에서 조건에 맞는 요소만 필터링합니다.<%-- 가격이 100 이상인 상품 목록 --%> <aspectran:eval expression="products.?[price >= 100]"/> - Collection Projection (
.![...]): 컬렉션의 요소를 변환하여 새로운 리스트를 만듭니다.<%-- 모든 상품의 이름만 추출한 리스트 --%> <aspectran:eval expression="products.![name]"/> - First/Last Selection (
.^[...],.$[...]): 조건에 맞는 첫 번째 또는 마지막 요소를 선택합니다.<aspectran:eval expression="products.^[category == 'Electronics']"/> - Matches Operator (
matches): 정규표현식과 매칭되는지 확인합니다.<aspectran:eval expression="user.email matches '^[\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}$'"/> - Type Operator (
T(...)): 정적(Static) 클래스 타입에 접근하여 상수나 메소드를 호출합니다.<aspectran:eval expression="T(java.lang.Math).PI"/> <aspectran:eval expression="T(com.example.Constants).DEFAULT_PAGE_SIZE"/>
<aspectran:message>
다국어 메시지 소스에서 메시지를 가져옵니다.
- 실무 예제:
<%-- 단순 메시지 출력 --%> <aspectran:message code="label.username"/> <%-- 인자값 전달 --%> <aspectran:message code="msg.welcome" arguments="${user.name}"/> <%-- 메시지가 없을 때 기본 텍스트 --%> <aspectran:message code="non.existent.code" text="기본 메시지입니다."/> <%-- 결과를 변수에 저장하여 재사용 --%> <aspectran:message code="page.title" var="pTitle"/> <title>${pTitle}</title>
<aspectran:url>
URL 템플릿과 파라미터 인코딩을 지원하는 URL을 생성합니다.
- 실무 예제:
<%-- 기본적인 컨텍스트 경로 포함 URL --%> <a href="<aspectran:url value="/main"/>">홈으로</a> <%-- 쿼리 파라미터 추가 --%> <aspectran:url value="/search" var="searchUrl"> <aspectran:param name="keyword" value="Aspectran"/> <aspectran:param name="page" value="1"/> </aspectran:url> <a href="${searchUrl}">검색 결과 보기</a> <%-- URL 템플릿 파라미터 (PathVariable) --%> <aspectran:url value="/products/{id}"> <aspectran:param name="id" value="${product.id}"/> </aspectran:url>
<aspectran:profile>
실행 환경 프로필에 따라 화면 구성을 제어합니다.
- 실무 예제:
<%-- 개발 환경에서만 디버그 도구 노출 --%> <aspectran:profile expression="dev"> <div id="debug-toolbar">...</div> </aspectran:profile> <%-- 운영 환경이 아닐 때만 특정 스크립트 포함 --%> <aspectran:profile expression="!prod"> <script src="/js/test-helper.js"></script> </aspectran:profile> <%-- 다중 프로필 조건 (OR 연산) --%> <aspectran:profile expression="dev | staging"> <p>테스트 서버입니다.</p> </aspectran:profile>
3. JSP EL과의 충돌 해결 가이드
JSP 2.1 이상에서 #{...}는 Deferred Expression으로 인식되어 서버 오류가 발생할 수 있습니다. eval 태그에서 Aspectran 토큰 문법을 사용할 때는 다음 방식을 따르십시오.
권장 방식: 직접 접근
eval 태그는 현재 실행 중인 Activity 컨텍스트 내에서 동작하므로, 굳이 #{currentActivityData}와 같은 토큰을 쓸 필요 없이 객체 이름을 직접 사용하면 됩니다.
<%-- AS-IS (충돌 위험) --%>
<aspectran:eval expression="#{currentActivityData}.user.name"/>
<%-- TO-BE (안전하고 간결함) --%>
<aspectran:eval expression="user.name"/>
필요한 경우: 이스케이프 처리
만약 반드시 #{...} 문법을 그대로 사용해야 한다면, # 앞에 백슬래시(\)를 추가하여 JSP 엔진의 처리를 방해합니다.
<aspectran:eval expression="\#{currentActivityData}.user.name"/>