앞에서 `EL(${ })`은 JSP에서 값을 출력하는 용도라고 했다.
즉 EL은 “표현식”이지 “문(제어문)”을 처리하는 도구가 아니다.
그래서 화면에서 이런 요구가 생기면 EL만으로는 한계가 생긴다.
- 리스트를 반복해서 출력해야 한다
- 특정 조건일 때만 보여줘야 한다
- 값이 없으면 다른 화면을 보여줘야 한다
이런 “제어 흐름”을 JSP에서 처리하기 위해 등장한 것이 JSTL이다.
JSTL은 JSP에서 쓰는 “태그 기반 제어문 라이브러리”이다
JSTL(JavaServer Pages Standard Tag Library)은 말 그대로 JSP에서 쓰는 표준 태그 라이브러리이다.
자바 코드(if, for)를 JSP 안에 넣지 않고도 반복/조건 같은 처리를 할 수 있게 해준다.
핵심은 이것이다.
- EL은 출력(값을 꺼내 보여줌)
- JSTL은 제어(반복/조건 같은 흐름 제어)
JSTL을 쓰려면 taglib 지시자가 필요하다
JSTL은 JSP 기본 문법이 아니라 “라이브러리”이다.
그래서 JSP 상단에 아래 선언이 필요하다.
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
이 선언을 하면 JSP에서 c:로 시작하는 태그를 쓸 수 있다.
- <c:forEach>
- <c:if>
- <c:choose>
<c:forEach>: 리스트/배열을 반복 출력하는 표준 방식
화면에서 가장 흔한 요구가 “목록 출력”이다.
게시판 목록, 할 일 목록, 상품 목록처럼 반복해서 찍어야 하는 화면이 많다.
서블릿에서 리스트를 만들고 request에 담아 넘긴다고 하자.
- req.setAttribute("todos", todoList);
JSP에서는 JSTL로 이렇게 출력한다.
<c:forEach var="todo" items="${todos}">
<li>${todo.title}</li>
</c:forEach>
여기서 의미는 다음과 같다.
- items="${todos}" : 반복 대상(리스트/배열)을 지정한다
- var="todo" : 반복 중 한 개 요소를 담을 변수 이름이다
- 태그 내부는 반복 요소 기준으로 계속 실행된다
즉 자바로 치면 이런 느낌이다.
- for (Todo todo : todos) { ... }
<c:if>: 조건일 때만 출력하기
목록을 출력하다 보면 조건이 자주 생긴다.
예를 들어 완료된 할 일만 “완료” 표시를 붙이고 싶을 수 있다.
이때 <c:if>를 쓴다.
<c:if test="${todo.finished}">
<span>완료</span>
</c:if>
test 조건이 true일 때만 내부가 출력된다.
<c:choose>: 여러 조건 분기(switch 느낌)
if/else-if/else처럼 여러 갈래 분기를 하고 싶으면 <c:choose>를 쓴다.
<c:choose>
<c:when test="${empty todos}">
<p>할 일이 없다</p>
</c:when>
<c:otherwise>
<p>할 일이 있다</p>
</c:otherwise>
</c:choose>
여기서 empty는 EL에서 자주 쓰는 표현이다.
- ${empty todos} : todos가 null이거나 비어 있으면 true
핵심 정리
- EL은 출력용이다(값 꺼내기)
- JSTL은 제어용이다(반복/조건)
- JSTL을 쓰려면 taglib 지시자가 필요하다
- <c:forEach>는 목록 출력의 표준 방식이다
- <c:if>, <c:choose>로 조건 분기를 처리한다
'Web > Web Basics' 카테고리의 다른 글
| [MVC와 웹 흐름 제어] 1.JSP 단독 사용의 한계: 왜 Controller가 필요해지는가 (0) | 2026.03.29 |
|---|---|
| [서블릿과 JSP] 8. 톰캣(서블릿 컨테이너)은 실제로 무슨 일을 하는가 (0) | 2026.03.29 |
| [서블릿과 JSP] 6. 서블릿이 만든 데이터를 JSP가 읽는 방식 (0) | 2026.03.29 |
| [서블릿과 JSP] 5. request.getParameter()를 JSP에서 쓰는 방법 (0) | 2026.03.29 |
| [서블릿과 JSP] 4. JSP는 왜 필요한가 (0) | 2026.03.29 |