[서블릿과 JSP] 7. JSTL은 왜 필요하고, <c:forEach>는 무엇인가

2026. 3. 29. 17:22·Web/Web Basics

 

앞에서 `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
'Web/Web Basics' 카테고리의 다른 글
  • [MVC와 웹 흐름 제어] 1.JSP 단독 사용의 한계: 왜 Controller가 필요해지는가
  • [서블릿과 JSP] 8. 톰캣(서블릿 컨테이너)은 실제로 무슨 일을 하는가
  • [서블릿과 JSP] 6. 서블릿이 만든 데이터를 JSP가 읽는 방식
  • [서블릿과 JSP] 5. request.getParameter()를 JSP에서 쓰는 방법
sqaxe1
sqaxe1
woojoo-devlog 님의 블로그 입니다.
  • sqaxe1
    Woojoo's Devlog
    sqaxe1
  • 전체
    오늘
    어제
    • 분류 전체보기 (148)
      • Backend (9)
        • Servlet (7)
        • Spring (2)
      • Frontend (1)
      • CS (0)
      • Book (33)
        • 자바 웹 프로그래밍 Next Step (30)
        • 테스트 주도 개발: 고품질 쾌속개발을 위한 TDD.. (1)
        • 성공과 실패를 결정하는 1%의 네트워크 원리 (2)
      • Engineering (0)
        • Testing (0)
      • Infra (6)
        • AWS (6)
      • Java (4)
      • Network (1)
      • 김영한 (28)
        • 자바 입문 (8)
        • 실전 자바 - 기본편 (6)
        • 실전 자바 - 중급편 (10)
        • 실전 자바 - 고급편 (4)
      • Web (39)
        • Web Basics (39)
      • Project (24)
        • NeoSquare (0)
        • Memo Evolution (24)
      • 정보처리기사 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    java
    개발서적
    aws
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
sqaxe1
[서블릿과 JSP] 7. JSTL은 왜 필요하고, <c:forEach>는 무엇인가
상단으로

티스토리툴바