JSTL(JSP Standard Tag Library)이란?
JSTL은 JSP 페이지에서 자주 사용되는 기능을 태그 형태로 제공하는 라이브러리입니다. JSP 페이지를 더 간결하고 읽기 쉽게 만들어주는 표준 태그 모음이라고 생각하시면 됩니다.
JSTL의 탄생 배경
초기 JSP 페이지에서는 자바 코드를 직접 작성하는 스크립틀릿(<% %>)을 많이 사용했습니다. 하지만 이런 방식은 HTML과 자바 코드가 섞여 가독성이 떨어지고 유지보수가 어려웠습니다. 이러한 문제를 해결하기 위해 JSTL이 등장하게 되었습니다.
JSTL의 주요 태그 라이브러리
JSTL은 용도별로 5가지 태그 라이브러리로 구분됩니다:
1. Core 태그 라이브러리 (접두어: c)
가장 기본적이고 자주 사용되는 태그 모음입니다.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
주요 태그:
- <c:set>: 변수 설정
- <c:if>: 조건문
- <c:choose>, <c:when>, <c:otherwise>: 다중 조건문(if-else if-else와 유사)
- <c:forEach>: 반복문
- <c:url>: URL 생성
- <c:out>: 출력(XSS 방지 기능 포함)
2. 포맷팅 태그 라이브러리 (접두어: fmt)
날짜, 시간, 숫자, 통화 등의 포맷팅을 지원합니다.
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
주요 태그:
- <fmt:formatDate>: 날짜 포맷팅
- <fmt:formatNumber>: 숫자 포맷팅
- <fmt:setLocale>: 지역 설정
3. SQL 태그 라이브러리 (접두어: sql)
데이터베이스 작업을 위한 태그입니다.
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
주요 태그:
- <sql:query>: SQL 쿼리 실행
- <sql:update>: INSERT, UPDATE, DELETE 쿼리 실행
- <sql:transaction>: 트랜잭션 처리
4. XML 태그 라이브러리 (접두어: x)
XML 처리를 위한 태그입니다.
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
주요 태그:
- <x:parse>: XML 문서 파싱
- <x:out>: XML 요소 값 출력
- <x:forEach>: XML 요소 반복 처리
5. 함수 태그 라이브러리 (접두어: fn)
문자열 처리 함수를 제공합니다.
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
주요 함수:
- fn:length(): 컬렉션이나 문자열의 길이 반환
- fn:substring(): 부분 문자열 추출
- fn:replace(): 문자열 대체
- fn:indexOf(): 문자열 검색
JSP와 JSTL의 차이점
JSP(JavaServer Pages)란?
JSP는 자바 기반의 서버 사이드 스크립트 언어로, HTML 내에 자바 코드를 삽입하여 동적인 웹 페이지를 생성할 수 있게 해줍니다. JSP는 서블릿 기술의 확장으로, 컴파일 시 서블릿으로 변환됩니다.
JSP와 JSTL의 주요 차이점:
- 목적과 역할:
- JSP: 자바 코드를 HTML에 직접 삽입하여 동적 웹 페이지를 생성하는 기술
- JSTL: JSP 페이지 내에서 자주 사용되는 기능을 태그 형태로 제공하는 라이브러리
- 문법과 가독성:
- JSP 스크립틀릿: <% 자바 코드 %> 형태로 자바 코드를 직접 작성
- JSTL: <c:if>, <c:forEach> 등의 XML 형태의 태그 사용
- 유지보수성:
- JSP 스크립틀릿: HTML과 자바 코드가 섞여 있어 가독성이 떨어지고 유지보수가 어려움
- JSTL: 태그 기반으로 HTML과 유사한 구조를 가져 가독성이 좋고 유지보수가 용이함
- 개발 역할 분담:
- JSP 스크립틀릿: 자바 지식이 필요하여 디자이너와 개발자 간 협업이 어려움
- JSTL: HTML과 유사한 태그 구조로 디자이너와 개발자 간 협업이 용이함
JSTL 사용 예시
1. 변수 설정과 출력
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="name" value="홍길동" />
<p>이름: <c:out value="${name}" /></p>
2. 조건문 사용
<c:if test="${age >= 20}">
<p>성인입니다.</p>
</c:if>
<c:choose>
<c:when test="${score >= 90}">
<p>A 등급</p>
</c:when>
<c:when test="${score >= 80}">
<p>B 등급</p>
</c:when>
<c:otherwise>
<p>C 등급</p>
</c:otherwise>
</c:choose>
3. 반복문 사용
<c:forEach var="i" begin="1" end="5">
<p>${i}번째 항목</p>
</c:forEach>
<c:forEach var="item" items="${productList}">
<p>상품명: ${item.name}, 가격: ${item.price}</p>
</c:forEach>
4. 날짜 및 숫자 포맷팅
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<p>
<fmt:formatDate value="${now}" pattern="yyyy-MM-dd HH:mm:ss" />
</p>
<p>
가격: <fmt:formatNumber value="${price}" type="currency" currencySymbol="₩" />
</p>
JSP 스크립틀릿과 JSTL 비교 예시
같은 기능을 구현한 두 가지 방식 비교
1. JSP 스크립틀릿 방식:
<table>
<tr>
<th>이름</th>
<th>나이</th>
<th>상태</th>
</tr>
<%
List<User> userList = (List<User>)request.getAttribute("userList");
for(User user : userList) {
%>
<tr>
<td><%= user.getName() %></td>
<td><%= user.getAge() %></td>
<td>
<% if(user.getAge() >= 20) { %>
성인
<% } else { %>
미성년자
<% } %>
</td>
</tr>
<% } %>
</table>
2. JSTL 방식:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<table>
<tr>
<th>이름</th>
<th>나이</th>
<th>상태</th>
</tr>
<c:forEach var="user" items="${userList}">
<tr>
<td><c:out value="${user.name}" /></td>
<td><c:out value="${user.age}" /></td>
<td>
<c:choose>
<c:when test="${user.age >= 20}">성인</c:when>
<c:otherwise>미성년자</c:otherwise>
</c:choose>
</td>
</tr>
</c:forEach>
</table>
JSTL의 장점
- 가독성 향상: HTML과 유사한 태그 구조로 코드의 가독성이 좋아집니다.
- 유지보수 용이: 자바 코드와 마크업이 분리되어 유지보수가 쉬워집니다.
- 보안 강화: <c:out> 태그는 기본적으로 XSS 공격을 방지합니다.
- 코드 중복 감소: 자주 사용되는 기능을 태그로 제공하여 코드 중복을 줄입니다.
- MVC 패턴 지원: 비즈니스 로직과 프레젠테이션 로직의 분리를 촉진합니다.
JSTL의 단점
- 학습 곡선: 처음 사용자에게는 새로운 태그 라이브러리를 학습해야 하는 부담이 있습니다.
- 복잡한 로직 처리의 한계: 매우 복잡한 로직은 여전히 자바 코드로 처리하는 것이 효율적일 수 있습니다.
- 라이브러리 의존성: 별도의 라이브러리를 추가해야 합니다.
'Back-End' 카테고리의 다른 글
| [Spring] 기초 공부 (1) | 2025.04.15 |
|---|---|
| JDBC와 JPA (1) | 2025.04.07 |
| [API] 자주 쓰는 API 정리 (4) | 2025.03.11 |
| [Kuberbetes] 쿠버네티스의 개념 (0) | 2025.03.10 |
| [JSP/Servlet] 웹개발 기초 1 (0) | 2025.02.26 |