웹 개발/웹 개발 기초

EL, JSTL이란?

Blue_bull 2025. 2. 7. 21:09

📌 초급 개발자를 위한 EL(Expression Language, ${}) 개념 정리

EL(Expression Language, 표현 언어)이란?
JSP(Java Server Pages)에서 데이터를 간편하게 출력할 수 있도록 도와주는 기능입니다.
기존의 <%= request.getAttribute("name") %> 같은 복잡한 코드를 ${name}으로 간단하게 쓸 수 있게 해줍니다.
주로 request, session, application 스코프에 저장된 데이터를 출력할 때 사용됩니다.


✅ 1. EL(Expression Language) 왜 필요한가?

🔹 기존 방식 (EL 없이 JSP에서 데이터 출력)

<% String name = (String) request.getAttribute("name"); %>
<p>이름: <%= name %></p>

request.getAttribute()를 직접 호출해야 하므로 코드가 길고 복잡함.
타입 캐스팅((String) request.getAttribute("name"))을 직접 해야 함.


🔹 EL을 사용한 방식 (더 간결한 코드)

<p>이름: ${name}</p>

request.getAttribute("name")을 자동으로 찾아 출력함.
타입 캐스팅이 필요 없음.
코드가 짧고 가독성이 좋아짐.


✅ 2. EL을 사용하는 방법

🔹 EL로 데이터 출력하기

EL은 주로 JSP에서 request.setAttribute()로 저장된 데이터를 출력할 때 사용됩니다.

🔹 서블릿에서 데이터 저장

request.setAttribute("name", "홍길동");
RequestDispatcher dispatcher = request.getRequestDispatcher("profile.jsp");
dispatcher.forward(request, response);

🔹 JSP에서 EL을 사용하여 데이터 출력

<p>이름: ${name}</p>  <!-- "홍길동" 출력 -->

EL이 자동으로 request.getAttribute("name")을 찾아 출력합니다.


✅ 3. EL에서 사용 가능한 데이터 스코프

EL 표현식 설명
${param.name} request.getParameter("name") (쿼리 스트링 or 폼 데이터 가져오기)
${requestScope.name} request.getAttribute("name") (요청 스코프 데이터 가져오기)
${sessionScope.user} session.getAttribute("user") (세션 데이터 가져오기)
${applicationScope.count} application.getAttribute("count") (애플리케이션 데이터 가져오기)

🔹 예제: EL로 스코프별 데이터 가져오기

<p>쿼리스트링 값: ${param.username}</p>
<p>요청 스코프 값: ${requestScope.name}</p>
<p>세션 스코프 값: ${sessionScope.user}</p>
<p>애플리케이션 스코프 값: ${applicationScope.count}</p>

✅ 4. EL의 연산 기능

EL은 단순히 데이터를 출력하는 것뿐만 아니라, 연산도 가능합니다.

🔹 수학 연산

<p>10 + 20 = ${10 + 20}</p>  <!-- 30 출력 -->
<p>100 - 50 = ${100 - 50}</p>  <!-- 50 출력 -->

🔹 문자열 연산

<p>이름: ${"홍" + "길동"}</p>  <!-- 홍길동 출력 -->

🔹 논리 연산

<p>1 == 1 ? ${1 == 1}</p>  <!-- true 출력 -->
<p>10 > 20 ? ${10 > 20}</p>  <!-- false 출력 -->

✅ 5. EL에서 객체의 속성 출력하기

EL은 객체의 getter 메서드를 자동으로 호출합니다.
user.getName()을 호출하는 대신 ${user.name} 으로 간단하게 사용할 수 있습니다.

🔹 서블릿에서 객체 저장

User user = new User("홍길동", 25);
request.setAttribute("user", user);

🔹 User 클래스

public class User {
    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() { return name; }
    public int getAge() { return age; }
}

🔹 JSP에서 EL을 사용하여 객체의 속성 출력

<p>이름: ${user.name}</p>  <!-- 홍길동 출력 -->
<p>나이: ${user.age}</p>  <!-- 25 출력 -->

EL은 user.getName()을 자동으로 찾아서 ${user.name}으로 출력합니다.


✅ 6. Spring과 Spring Boot에서 EL 사용 가능 여부

Spring에서 JSP를 사용할 경우 EL(${})을 그대로 사용할 수 있습니다.
Spring Boot에서는 Thymeleaf를 사용하며 ${} 대신 th:text="${}"와 같은 문법을 사용합니다.

🔹 Spring Boot + Thymeleaf 예제 (EL과 비슷한 표현)

<p th:text="${user.name}"></p>  <!-- Thymeleaf 방식 -->

JSP의 ${user.name}과 비슷하지만, Thymeleaf에서는 th:text="${user.name}"을 사용합니다.


✅ 7. 결론

EL(Expression Language, ${})은 JSP에서 데이터를 출력할 때 사용되는 간단한 표현 언어입니다.
서블릿에서 request.setAttribute()로 저장된 데이터를 쉽게 출력할 수 있습니다.
객체의 getter를 자동으로 찾아서 사용할 수 있습니다. (${user.name}user.getName() 호출)
Spring의 JSP에서는 그대로 사용되지만, Spring Boot에서는 Thymeleaf가 기본 템플릿 엔진으로 사용됩니다.

🚀 이제 EL을 이해했으니, JSP에서 데이터를 출력하는 게 훨씬 쉬워질 거야! 😊



📌 EL(Expression Language, ${})는 Spring과 Spring Boot에서도 사용될까?

네, 하지만 Spring과 Spring Boot에서는 JSP의 EL 대신 다른 템플릿 엔진(Thymeleaf, FreeMarker 등)이 주로 사용됩니다!

JSP 기반의 Spring 프로젝트에서는 EL(${})을 그대로 사용할 수 있습니다.
Spring Boot에서는 JSP를 잘 사용하지 않고, 대신 Thymeleaf 같은 템플릿 엔진을 선호합니다.
Thymeleaf에서는 ${}와 유사한 표현식을 사용하지만, 문법이 조금 다릅니다.


✅ 1. Spring(Spring MVC)에서 EL(${}) 사용 가능 여부

Spring MVC에서 JSP를 사용할 경우 EL(${})을 그대로 사용할 수 있습니다.
JSP에서 데이터를 출력할 때 EL을 사용하여 request, session, model 데이터를 참조할 수 있습니다.

🔹 Spring + JSP에서 EL(${}) 사용 예제

1️⃣ 컨트롤러 (Spring MVC)

@Controller
@RequestMapping("/member")
public class MemberController {

    @GetMapping("/profile")
    public String showProfile(Model model) {
        model.addAttribute("username", "홍길동");
        return "member/profile";  // profile.jsp로 이동
    }
}

model.addAttribute("username", "홍길동");으로 데이터를 JSP에 전달


2️⃣ JSP (profile.jsp)

<p>사용자 이름: ${username}</p>  <!-- "홍길동" 출력 -->

Spring MVC에서 JSP를 사용할 경우 EL(${})을 그대로 사용 가능!


✅ 2. Spring Boot에서 EL(${}) 사용 가능 여부

Spring Boot에서는 JSP를 기본적으로 사용하지 않으므로, EL(${})을 잘 사용하지 않습니다.
대신, Thymeleaf 같은 템플릿 엔진을 사용하며, ${} 대신 th:text와 같은 표현식을 사용합니다.

🔹 Spring Boot + Thymeleaf에서 데이터 출력 예제

1️⃣ 컨트롤러 (Spring Boot)

@Controller
@RequestMapping("/member")
public class MemberController {

    @GetMapping("/profile")
    public String showProfile(Model model) {
        model.addAttribute("username", "홍길동");
        return "member/profile";  // profile.html로 이동
    }
}

Spring Boot에서는 JSP 대신 Thymeleaf를 사용하며, model.addAttribute()를 통해 데이터를 전달합니다.


2️⃣ Thymeleaf 템플릿 (profile.html)

<p>사용자 이름: <span th:text="${username}"></span></p>

Thymeleaf에서는 EL(${}) 대신 th:text="${}"를 사용합니다.


✅ 3. Spring, Spring Boot에서 EL(${}) 사용 가능 여부 비교

환경 JSP 사용 여부 EL(${}) 사용 여부 주로 사용하는 템플릿 엔진
Spring (Spring MVC) 가능 가능 (${} 그대로 사용) JSP, Thymeleaf 가능
Spring Boot 거의 사용 안 함 거의 사용 안 함 Thymeleaf, FreeMarker

✅ 4. 결론

Spring MVC에서는 JSP를 사용할 경우 EL(${})을 그대로 사용할 수 있습니다.
Spring Boot에서는 JSP 대신 Thymeleaf를 사용하며, ${} 대신 th:text="${}" 같은 표현식을 사용합니다.
Spring Boot에서 JSP를 사용하려면 별도 설정이 필요하며, 일반적으로 권장되지 않습니다.

📌 ?의 의미 (JSP, EL, Java에서 사용되는 경우 정리)

?는 사용하는 환경에 따라 의미가 다릅니다.
1️⃣ EL(Expression Language, ${})에서 ?
2️⃣ JSP에서 ?
3️⃣ Java에서 ?



✅ 1. EL(Expression Language)에서 ?

EL에서는 ?를 직접 사용하지 않지만, 삼항 연산자 (조건 ? 값1 : 값2)를 지원합니다.
조건이 참이면 값1, 거짓이면 값2를 반환합니다.

🔹 EL 삼항 연산자 예제

<p>10이 5보다 큰가? ${10 > 5 ? "참" : "거짓"}</p>

🔹 출력 결과

10이 5보다 큰가? 참

10 > 5true이므로 "참"이 출력됩니다.


✅ 2. JSP에서 ?

JSP에서 ?는 주로 URL에서 쿼리 스트링(Query String) 값을 전달할 때 사용됩니다.
?key=value 형식으로 데이터를 전송할 수 있습니다.

🔹 예제: 하이퍼링크에 ?를 사용하여 데이터 전달

<a href="profile.jsp?username=hong">프로필 보기</a>

profile.jsp?username=hong으로 이동하며, username=hong이라는 데이터를 함께 보냄.

🔹 JSP에서 쿼리 스트링 값 읽기

<%
String username = request.getParameter("username");
%>
<p>이름: <%= username %></p>

?username=hong이 포함된 URL로 요청하면 "이름: hong"이 출력됨.


✅ 3. Java에서 ?

Java에서는 ?여러 가지 의미로 사용될 수 있음.

🔹 (1) 삼항 연산자 (Ternary Operator)

String result = (10 > 5) ? "참" : "거짓";
System.out.println(result);

10 > 5true이므로 "참"이 출력됨.


🔹 (2) 제네릭(Generic)에서 와일드카드 ?

제네릭에서 ?는 "어떤 타입이든 가능"하다는 의미.

public void printList(List<?> list) {  // 어떤 타입이든 받을 수 있음
    for (Object obj : list) {
        System.out.println(obj);
    }
}

List<String>, List<Integer> 등 다양한 타입을 받을 수 있음.


✅ 최종 정리

사용 환경 ?의 의미 예제
EL (Expression Language) 삼항 연산자 ${10 > 5 ? "참" : "거짓"}
JSP URL 쿼리 스트링 시작 <a href="profile.jsp?username=hong">
Java (일반 연산자) 삼항 연산자 String result = (10 > 5) ? "참" : "거짓";
Java (제네릭) 와일드카드 (타입 제한 없음) List<?> list

🚀 이제 ?의 의미를 완벽하게 이해했을 거야! 😊



📌 JSP에서 ?의 의미 및 데이터 전달 스코프


✅ 1. JSP에서 ?의 의미

JSP에서 ?는 URL에서 "쿼리 스트링(Query String)"을 시작하는 기호입니다.
쿼리 스트링(Query String)은 URL을 통해 데이터를 전달하는 방법 중 하나입니다.
일반적으로 GET 요청에서 데이터를 전달할 때 사용됩니다.


🔹 예제: ?를 사용한 데이터 전달

<a href="profile.jsp?username=hong">프로필 보기</a>

?username=hongusername=hong 데이터를 profile.jsp에 전달.
✔ 브라우저 주소창에 http://localhost:8080/profile.jsp?username=hong으로 요청이 발생함.


✅ 2. 어느 스코프에 전달될까? (request.getParameter() 사용)

쿼리 스트링으로 전달된 데이터는 "요청 파라미터(Request Parameter)"로 처리됩니다.
즉, request 객체를 통해 접근할 수 있으며, "요청(Request) 스코프"에 저장됩니다.


🔹 JSP에서 request.getParameter()를 사용하여 데이터 읽기

<%
String username = request.getParameter("username");  // 요청 스코프에서 데이터 가져옴
%>
<p>사용자 이름: <%= username %></p>

결과: ?username=hong이 포함된 URL로 요청하면 "사용자 이름: hong"이 출력됨.
쿼리 스트링 값은 request 스코프에 저장되며, request.getParameter("username")으로 가져올 수 있음.


✅ 3. 스코프 정리 (request, session, application)

스코프 데이터 저장 위치 유지 기간 예제
Request (요청 스코프) 현재 요청 내에서만 유지 페이지 이동 시 사라짐 request.getParameter("username")
Session (세션 스코프) 특정 사용자에 대해 유지 브라우저 종료 또는 세션 만료 시 삭제 session.setAttribute("user", user);
Application (애플리케이션 스코프) 서버가 실행되는 동안 유지 서버가 종료될 때까지 유지됨 application.setAttribute("siteName", "MyWebsite");

쿼리 스트링으로 전달된 값은 request 스코프에 저장되며, request.getParameter("key")로 가져올 수 있음.


✅ 4. 결론

JSP에서 ?는 URL의 쿼리 스트링(Query String)을 시작하는 기호.
쿼리 스트링으로 전달된 데이터는 request 스코프에 저장됨.
request.getParameter("key")를 사용하여 데이터를 가져올 수 있음.

🚀 이제 JSP에서 ?의 역할과 데이터 전달 스코프를 완벽히 이해했을 거야! 😊

📌 JSTL(JavaServer Pages Standard Tag Library) 개념 정리

JSTL(JavaServer Pages Standard Tag Library)이란?
JSP(Java Server Pages)에서 자주 사용되는 기능을 편리하게 사용할 수 있도록 제공하는 태그 라이브러리입니다.
EL(Expression Language, ${})과 함께 사용되며, JSP 내에서 Java 코드 (<% %>)를 최소화하는 것이 목적입니다.
조건문, 반복문, 데이터 출력, 포맷팅, SQL 실행 등을 쉽게 할 수 있음.


✅ 1. JSTL을 사용해야 하는 이유

기존의 JSP 코드에서는 Java 코드가 직접 포함되어 복잡해지는 경우가 많습니다.

🔹 JSTL 없이(기존 JSP 방식)

<%
for(int i = 0; i < 5; i++) {
%>
    <p>현재 숫자: <%= i %></p>
<%
}
%>

<% %><%= %>가 많아져서 가독성이 떨어짐.


🔹 JSTL을 사용하면 더 간결해짐

<c:forEach var="i" begin="0" end="4">
    <p>현재 숫자: ${i}</p>
</c:forEach>

JSP 코드가 더 깔끔하고 유지보수가 쉬워짐.
<% %> 대신 태그 기반(c:forEach)으로 사용 가능.


✅ 2. JSTL의 주요 기능 및 태그

JSTL은 기능별로 여러 개의 태그 라이브러리(코어, 포맷, SQL, XML, 함수)를 제공합니다.

라이브러리 설명 태그 예제
Core (코어) 변수 설정, 조건문, 반복문 등 기본적인 기능 <c:if>, <c:forEach>, <c:set>
Format (포맷팅) 숫자, 날짜, 국제화 포맷 적용 <fmt:formatNumber>, <fmt:formatDate>
SQL (데이터베이스 연동) JSP에서 SQL 쿼리 실행 (하지만 실무에서는 MyBatis, JPA 사용) <sql:query>, <sql:update>
XML (XML 처리) XML 데이터 파싱 및 출력 <x:parse>, <x:out>
Functions (함수) 문자열 처리 관련 기능 제공 ${fn:length(list)}

✅ 3. JSTL 사용법

🔹 1️⃣ JSTL 라이브러리 선언하기 (taglib 지시어 추가)

JSTL을 사용하려면 JSP 상단에 라이브러리를 선언해야 합니다.

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

prefix="c"를 설정하면 c:forEach, c:if 등의 태그를 사용할 수 있습니다.


🔹 2️⃣ 주요 JSTL 태그 예제

(1) c:set - 변수 선언

<c:set var="name" value="홍길동" />
<p>이름: ${name}</p>  <!-- 홍길동 출력 -->

EL(${})을 사용하여 변수 값을 출력할 수 있음.


(2) c:if - 조건문

<c:if test="${10 > 5}">
    <p>10은 5보다 큽니다.</p>
</c:if>

test 속성의 조건이 true이면 태그 내부의 코드를 실행함.


(3) c:choose, c:when, c:otherwise - 다중 조건문 (if-else)

<c:set var="age" value="20" />
<c:choose>
    <c:when test="${age >= 18}">
        <p>성인입니다.</p>
    </c:when>
    <c:otherwise>
        <p>미성년자입니다.</p>
    </c:otherwise>
</c:choose>

c:chooseif-else if-else 구조와 동일한 역할을 함.


(4) c:forEach - 반복문

<c:forEach var="num" begin="1" end="5">
    <p>숫자: ${num}</p>
</c:forEach>

1부터 5까지 반복하면서 num 변수를 출력.


(5) c:forEach - 리스트(배열) 반복

<c:set var="fruits" value="Apple, Banana, Cherry" />
<c:forEach var="fruit" items="${fruits.split(', ')}">
    <p>과일: ${fruit}</p>
</c:forEach>

리스트(배열)를 c:forEach로 반복 처리 가능.


✅ 4. JSTL을 사용하기 위한 필수 설정

JSTL을 사용하려면 JSTL 라이브러리를 추가해야 합니다.

🔹 Maven 프로젝트에서 JSTL 추가 (pom.xml)

Spring 또는 JSP 프로젝트에서 JSTL을 사용하려면 아래와 같이 pom.xml에 추가해야 합니다.

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

Maven 프로젝트가 아니라면 jstl-1.2.jar을 직접 다운로드해서 lib 폴더에 추가해야 합니다.


✅ 5. JSTL vs EL(${}) 차이

구분 JSTL (<c:forEach>, <c:if>) EL (${})
기능 조건문, 반복문, 변수 설정 등 데이터를 출력하는 표현식
사용 목적 JSP에서 Java 코드를 줄이고 태그 기반으로 로직 처리 request, session 데이터를 간단하게 출력
예제 <c:if test="${num > 5}"> ${user.name}

EL은 데이터를 출력할 때 주로 사용되고, JSTL은 반복문과 조건문을 처리할 때 사용됩니다.


✅ 6. Spring과 Spring Boot에서 JSTL 사용 가능?

Spring에서 JSP를 사용할 경우 JSTL을 그대로 사용할 수 있습니다.
Spring Boot에서는 JSP를 기본적으로 사용하지 않으며, 대신 Thymeleaf를 사용합니다.

🔹 Spring Boot + Thymeleaf에서 반복문 (JSTL 대체 방식)

<ul>
    <li th:each="fruit : ${fruits}" th:text="${fruit}"></li>
</ul>

Spring Boot에서는 c:forEach 대신 th:each를 사용하여 리스트를 출력합니다.


✅ 7. 결론

JSTL(JavaServer Pages Standard Tag Library)은 JSP에서 반복문, 조건문 등을 쉽게 사용할 수 있도록 도와주는 태그 라이브러리입니다.
Java 코드를 최소화하고, <% %> 대신 <c:forEach>, <c:if> 등의 태그를 사용하여 가독성을 높입니다.
Spring의 JSP에서는 JSTL을 사용할 수 있지만, Spring Boot에서는 JSP 대신 Thymeleaf를 권장합니다.

🚀 이제 JSTL을 이해했으니, JSP에서 더 효율적으로 코드를 작성할 수 있을 거야! 😊