[Spring Boot] EL & JSTL

hameeeยท2023๋…„ 12์›” 23์ผ
0

Spring Boot

๋ชฉ๋ก ๋ณด๊ธฐ
10/20
post-thumbnail

๐Ÿ“EL(Expression Language)

  • JSP์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•˜๊ณ  ์กฐ์ž‘ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ„ํŽธํ•œ ํ‘œํ˜„ ์–ธ์–ด์ด๋‹ค.
  • JSP ์Šคํฌ๋ฆฝํŠธ ์š”์†Œ ์ค‘ ํ‘œํ˜„์‹(<%= %>)์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋‹ค.
<%-- 1๏ธโƒฃ ๋ณ€์ˆ˜ ์‚ฌ์šฉ --%>
${user.name}

<%-- 2๏ธโƒฃ ์ˆ˜์‹ ์‚ฌ์šฉ --%>
${num1 + num2}

<%-- 3๏ธโƒฃ ์ปฌ๋ ‰์…˜ ๋ฐ ๋งต ์‚ฌ์šฉ --%>
${list[0]}
${map['key']}

<%-- 4๏ธโƒฃ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ --%>
${helperObject.calculateTotal(amount)}

๐Ÿ“JSTL(JSP Standard Tag Library)

  • Java ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํƒœ๊ทธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.
  • JSP ์Šคํฌ๋ฆฝํŠธ ์š”์†Œ ์ค‘ ์„ ์–ธ๋ฌธ(<%! %>), ์Šคํฌ๋ฆฝํ‹€๋ฆฟ(<% %>), ํ‘œํ˜„์‹(<%= %>)์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ฝ”๋“œ ๊ฐ€๋…์„ฑ๊ณผ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.
    1. Core: set, out, if, choose/when/otherwise, forEach ๋“ฑ
    1. Formatting
    1. ํ•จ์ˆ˜

1. Core

  • JSTL์˜ Core๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์„ ์–ธ๋ฌธ์„ JSP ํŒŒ์ผ ์ƒ๋‹จ์— ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

1) c:set

  • ์—ญํ• : ๋ณ€์ˆ˜์— ๊ฐ’ ํ• ๋‹น
  • ๋ฐฉ์‹
    • value ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹
    • value ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฐฉ์‹
  • ์†์„ฑ
    • var: ๋ณ€์ˆ˜๋ช…
    • value: ๊ฐ’
<%-- 1๏ธโƒฃ value ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹ --%>
<c:set var="number1" value="100" />

<%-- 2๏ธโƒฃ value ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฐฉ์‹ --%>
<c:set var="number2">100</c:set>

2) c:out

๐Ÿšฉ escapeXml="true"๋‚˜ default ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, EL(${})์„ ์‚ฌ์šฉํžˆ๋Š” ๊ฒƒ์ด ๋” ๊ฐ„๊ฒฐํ•œ๋‹ค.

  • ์—ญํ• : ๊ฐ’ ์ถœ๋ ฅ
  • ์†์„ฑ
    • value: ์ถœ๋ ฅํ•  ๊ฐ’/๋ณ€์ˆ˜๋ช…
    • escapeXml: ๊ฐ’์— ํฌํ•จ๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ ๋ฌด์‹œ ์—ฌ๋ถ€(true/false), ๊ธฐ๋ณธ๊ฐ’์€ true
    • default: ๊ธฐ๋ณธ๊ฐ’
<c:out value="Hello world" />
<c:out value="${number1}" />

<c:out value="<script>alert('Hello world')</script>" />
<%-- ์ถœ๋ ฅ: <script>alert('Hello world')</script> --%>

<c:out value="<script>alert('Hello world')</script>" escapeXml="true" />
<%-- ์ถœ๋ ฅ: <script>alert('Hello world')</script> --%>

<c:out value="<script>alert('Hello world')</script>" escapeXml="false" />
<%-- ์ถœ๋ ฅ: ์•Œ๋ฆผ์ฐฝ  --%>

3) c:if

  • ์—ญํ• : if ์กฐ๊ฑด๋ฌธ
  • ์†์„ฑ
    • test: ์กฐ๊ฑด
์„ค๋ช…์ •์„ ๋ฐฉ๋ฒ•์‚ฌ์šฉ ๊ฐ€๋Šฅ ๋ฐฉ๋ฒ•
๊ฐ™๋‹คeq==
๋‹ค๋ฅด๋‹คne!=
null์ด๋‹คempty
null์ด ์•„๋‹ˆ๋‹คnot empty!empty
<c:if test="${number1 > 50}">
	number1์€ 50๋ณด๋‹ค ํฌ๋‹ค.
</c:if>

4) c:choose, c:when, c:otherwise

  • ์—ญํ• : if-else if-else ์กฐ๊ฑด๋ฌธ
  • ์†์„ฑ
    • c:when
      • test: ์กฐ๊ฑด
<c:choose>
	<c:when test="${number1 < 50}">
		50 ๋ฏธ๋งŒ์ž…๋‹ˆ๋‹ค.
	</c:when>
	<c:when test="${number1 < 100}">
		100 ๋ฏธ๋งŒ์ž…๋‹ˆ๋‹ค.
	</c:when>
	<c:otherwise>
		100 ์ด์ƒ์ž…๋‹ˆ๋‹ค.
	</c:otherwise>
</c:choose>

5) c:forEach

๐Ÿšฉ ์ฃผ์˜ํ•  ์ 

  • ์ผ๋ฐ˜ ๋ฐ˜๋ณต๋ฌธ๊ณผ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ: var ๋ณ€์ˆ˜ ํ˜„์žฌ ๊ฐ’ == status.index == status.current
  • ํ–ฅ์ƒ๋œ for๋ฌธ๊ณผ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ: var ๋ณ€์ˆ˜ ํ˜„์žฌ ๊ฐ’ == status.current
  • ์—ญํ• : ๋ฐ˜๋ณต๋ฌธ
  • ๋ฐฉ์‹
    • ์ผ๋ฐ˜ ๋ฐ˜๋ณต๋ฌธ๊ณผ ์œ ์‚ฌํ•œ ๋ฐฉ์‹
    • ํ–ฅ์ƒ๋œ for๋ฌธ๊ณผ ์œ ์‚ฌํ•œ ๋ฐฉ์‹
  • ์†์„ฑ
    • ๐Ÿ‘‰ ๊ณตํ†ต
      • var: ๊บผ๋‚ด์ง€๋Š” ๋ฐ์ดํ„ฐ์˜ ๋ณ€์ˆ˜๋ช…
      • varStatus: ํ˜„์žฌ ๋ฐ˜๋ณต์— ๋Œ€ํ•œ ์ƒํƒœ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜, ์ผ๋ฐ˜์ ์œผ๋กœ status๋กœ ์ง€์Œ
        • index
          • ์ผ๋ฐ˜ ๋ฐ˜๋ณต๋ฌธ๊ณผ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ: var๋กœ ์ง€์ •๋œ ๋ณ€์ˆ˜์˜ ํ˜„์žฌ ๊ฐ’
          • ํ–ฅ์ƒ๋œ for๋ฌธ๊ณผ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ: 0๋ถ€ํ„ฐ ์‹œ์ž‘
        • count: 1๋ถ€ํ„ฐ ์‹œ์ž‘
        • first: ๋ฐ˜๋ณต๋ฌธ์ด ์ฒซ๋ฒˆ์งธ๋กœ ๋Œ์•˜์œผ๋ฉด true, ๊ทธ ์™ธ false
        • last: ๋ฐ˜๋ณต๋ฌธ์ด ๋งˆ์ง€๋ง‰ ๋ฒˆ์งธ์ด๋ฉด true, ๊ทธ ์™ธ false
        • current: var๋กœ ์ง€์ •๋œ ๋ณ€์ˆ˜์˜ ํ˜„์žฌ ๊ฐ’

    • ๐Ÿ‘‰ ์ผ๋ฐ˜ ๋ฐ˜๋ณต๋ฌธ๊ณผ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ
      • begin: ์‹œ์ž‘๊ฐ’
      • end: ์ข…๋ฃŒ๊ฐ’
      • step: ์ฆ๊ฐ€์‹œํ‚ฌ ๊ฐ’, ๊ธฐ๋ณธ๊ฐ’์€ 1

    • ๐Ÿ‘‰ ํ–ฅ์ƒ๋œ for๋ฌธ๊ณผ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ
      • items: ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ผ ๊ฐ์ฒด๋ช…

1๏ธโƒฃ ์ผ๋ฐ˜ ๋ฐ˜๋ณต๋ฌธ๊ณผ ์œ ์‚ฌํ•œ ๋ฐฉ์‹

<c:forEach begin="12" end="20" step="2" var="i" varStatus="status">
	<br>
	i: ${i}<br> 
	index: ${status.index}<br> <%-- index: i์™€ ๋™์ผ --%>
	count: ${status.count}<br>
	first: ${status.first}<br>
	last: ${status.last}<br>
	current: ${status.current}<br>
</c:forEach>

2๏ธโƒฃ ํ–ฅ์ƒ๋œ for๋ฌธ๊ณผ ์œ ์‚ฌํ•œ ๋ฐฉ์‹

๐Ÿšฉ ์ฃผ์˜ํ•  ์ 

  • items๊ณผ var์˜ ๋ณ€์ˆ˜๋ช…์€ ๋‹ฌ๋ผ์•ผ ํ•œ๋‹ค.
  • items๋Š” ํฐ๋”ฐ์˜ดํ‘œ์™€ EL(${})์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.
<%-- numbers: [1000, 72, 999, 12, 88]  --%>

<c:forEach items="${numbers}" var="number" varStatus="status">
	<br>
	number: ${number}<br>
	index: ${status.index}<br> <%-- index: 0๋ถ€ํ„ฐ ์‹œ์ž‘ --%>
	count: ${status.count}<br>
	first: ${status.first}<br>
	last: ${status.last}<br>
	current: ${status.current}<br>
</c:forEach>

2. Formatting

  • JSTL์˜ Formatting๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์„ ์–ธ๋ฌธ์„ JSP ํŒŒ์ผ ์ƒ๋‹จ์— ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.
    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>

1) fmt:formatNumber

  • ์—ญํ• : ์ˆซ์ž ํ˜•์‹ ์ง€์ •
  • ์†์„ฑ
    • value: ํ˜•์‹์„ ์ง€์ •ํ•˜๋ ค๋Š” ์ˆซ์ž
    • type: ํ˜•์‹์„ ์ง€์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ž๋ฃŒํ˜•(number/currency/percent). ๊ธฐ๋ณธ๊ฐ’์€ number.
    • groupingUsed: ์ฒœ ๋‹จ์œ„ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ• ์ง€ ์—ฌ๋ถ€(true/false). ๊ธฐ๋ณธ๊ฐ’์€ true.
    • currencySymbol: type์ด currency์ผ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•  ํ†ตํ™” ๊ธฐํ˜ธ. ๊ธฐ๋ณธ๊ฐ’์€ โ‚ฉ.
    • var: ํ˜•์‹์ด ์ ์šฉ๋œ ์ˆซ์ž๋ฅผ ์ €์žฅํ•  ๋ณ€์ˆ˜์˜ ์ด๋ฆ„
    • pattern: ํ˜•์‹์„ 0๊ณผ #์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์ •(0: ๊ฐ’์ด ์—†์–ด๋„ ์ž๋ฆฌ์ˆ˜๋ฅผ 0์œผ๋กœ ์ฑ„์›€, #: ๊ฐ’์ด ์žˆ์œผ๋ฉด ์ฑ„์šฐ๊ณ  ์—†์œผ๋ฉด ์ฑ„์šฐ์ง€ ์•Š์Œ)
<fmt:formatNumber value="12345678" /> <%-- 12,345,678 --%>

<fmt:formatNumber type="percent" value="0.4" /> <%-- 40% --%>

<fmt:formatNumber  value="12345678" groupingUsed="false" /> <%-- 12345678 --%>

<fmt:formatNumber type="currency" currencySymbol="$" value="12345678" /> <%-- $12,345,678 --%>

<fmt:formatNumber value="12345678" var="n1" />
${n1} <%-- 12,345,678 --%>

<fmt:formatNumber value="1234.5678" pattern="0.00000" /> <%-- 1234.56780 --%>
<fmt:formatNumber value="1234.5678" pattern="#.#####" /> <%-- 1234.5678 --%>

2) fmt:formatDate

  • ์—ญํ• : ๋‚ ์งœ ํ˜•์‹ ์ง€์ •
  • ์†์„ฑ
    • value: ํ˜•์‹์„ ์ง€์ •ํ•˜๋ ค๋Š” ๋‚ ์งœ. java.util.Date ์ž๋ฃŒํ˜•์ด์—ฌ์•ผ ํ•จ.
    • pattern: ๋‚ ์งœ ํ˜•์‹์„ ์ง์ ‘ ์ง€์ •ํ•  ๋•Œ ์‚ฌ์šฉ
    • var: ํ˜•์‹์ด ์ ์šฉ๋œ ๋‚ ์งœ๋ฅผ ์ €์žฅํ•  ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์„ ์ง€์ •
    • type: ํ˜•์‹์„ ์ง€์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ž๋ฃŒํ˜•(date/time/both). ๊ธฐ๋ณธ๊ฐ’์€ date.
<fmt:formatDate value="${now}" /> <%-- 2023. 12. 26. --%>

<fmt:formatDate value="${now}" pattern="yyyy๋…„ MM์›” dd์ผ HH์‹œ mm๋ถ„ ss์ดˆ" /> <%-- 2023๋…„ 12์›” 26์ผ 22์‹œ 42๋ถ„ 16์ดˆ --%>

<fmt:formatDate value="${now}" var="date1" />
${date1} <%-- 2023. 12. 26. --%>
	
<fmt:formatDate value="${now}" type="time" /> <%-- ์˜คํ›„ 10:42:16 --%>

3) fmt:parseDate

  • ์—ญํ• : ๋ฌธ์ž์—ด๋กœ ํ‘œํ˜„๋œ ๋‚ ์งœ๋ฅผ Date ์ž๋ฃŒํ˜•์œผ๋กœ ํŒŒ์‹ฑ
  • ์†์„ฑ
    • value: Date ์ž๋ฃŒํ˜•์œผ๋กœ ํŒŒ์‹ฑํ•˜๋ ค๋Š” ๋ฌธ์ž์—ด
    • pattern: value์˜ ๋‚ ์งœ ํ˜•์‹
    • var: ํŒŒ์‹ฑ๋œ Date ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•  ๋ณ€์ˆ˜์˜ ์ด๋ฆ„
<fmt:parseDate value="2023-12-26" pattern="yyyy-MM-dd" /> <%-- Tue Dec 26 00:00:00 KST 2023 --%>
	
<fmt:parseDate value="2023-12-26" pattern="yyyy-MM-dd" var="date2"/>
${date2} <%-- Tue Dec 26 00:00:00 KST 2023 --%>

3. ํ•จ์ˆ˜

  • JSTL์˜ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์„ ์–ธ๋ฌธ์„ JSP ํŒŒ์ผ ์ƒ๋‹จ์— ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.
    <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
  • ํƒœ๊ทธ๊ฐ€ ์•„๋‹Œ EL(${})์„ ์‚ฌ์šฉํ•œ๋‹ค.
${fn:contains('abc', 'a')} <%-- true --%>
${fn:containsIgnoreCase('abc', 'A')} <%-- true --%>
${fn:startsWith('abc', 'a')} <%-- true --%>
${fn:endsWith('abc', 'c')} <%-- true --%>
${fn:length('abc')} <%-- 3 --%>
${fn:replace('abc', 'a', 'A')} <%-- Abc --%>
${fn:split('abc', 'b')[0]} <%-- a --%>
${fn:substring('abc', 0, 1)} <%-- a --%>
${fn:toLowerCase('ABC')} <%-- abc --%>
${fn:toUpperCase('abc')} <%-- ABC --%>
<pre>${fn:trim('    a   b c     ')}</pre> <%-- a   b c --%>

0๊ฐœ์˜ ๋Œ“๊ธ€