** ๐Ÿ“ŒJSTL functions (fn:) ํ•จ์ˆ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์™„์ „ ์ •๋ณต**

๋ฌธ์ž์—ด ๊ธธ์ด, ํฌํ•จ ์—ฌ๋ถ€, ์ž˜๋ผ๋‚ด๊ธฐ, ์น˜ํ™˜, ๋ฆฌ์ŠคํŠธ ๋ณ€ํ™˜ ๋“ฑ ์‹ค๋ฌด ํ•ต์‹ฌ ๊ธฐ๋Šฅ


โœ… ๋ชฉ์ฐจ

  1. JSTL ํ•จ์ˆ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ž€?
  2. JSTL ํ•จ์ˆ˜ ์„ ์–ธ ๋ฐฉ๋ฒ•
  3. ์ฃผ์š” fn: ํ•จ์ˆ˜ ์ •๋ฆฌ
  4. ์‹ค์ „ ํ™œ์šฉ ์˜ˆ์ œ
  5. ๊ธฐ์ˆ ๋ฉด์ ‘ ๋Œ€๋น„ ์งˆ๋ฌธ
  6. ์š”์•ฝ ๋ฐ ๋งˆ๋ฌด๋ฆฌ

1๏ธโƒฃ JSTL ํ•จ์ˆ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ž€?

๐Ÿ“˜ JSTL์—์„œ ๋ฌธ์ž์—ด์ด๋‚˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณตํ•˜๋Š” ๋‚ด์žฅ ํ•จ์ˆ˜ ๋ชจ์Œ์ž…๋‹ˆ๋‹ค.

๐Ÿ’ก JSP๋Š” ์ž๋ฐ” ์ฝ”๋“œ ์—†์ด ํ‘œํ˜„๋งŒ ํ•ด์•ผ ํ•˜๋ฏ€๋กœ,

๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ๋„ <% %> ์—†์ด fn: ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


2๏ธโƒฃ JSTL ํ•จ์ˆ˜ ์„ ์–ธ ๋ฐฉ๋ฒ•

JSP ์ƒ๋‹จ์— ์•„๋ž˜ taglib ์„ ์–ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:

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

๊ทธ ํ›„ ${fn:ํ•จ์ˆ˜๋ช…(๊ฐ’)} ํ˜•์‹์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.


3๏ธโƒฃ ์ฃผ์š” fn: ํ•จ์ˆ˜ ์ •๋ฆฌ

ํ•จ์ˆ˜๋ช… ์„ค๋ช… ์˜ˆ์‹œ
fn:length() ๋ฌธ์ž์—ด/๋ฆฌ์ŠคํŠธ ๊ธธ์ด ${fn:length(name)}
fn:contains(str, keyword) ํŠน์ • ๋ฌธ์ž์—ด ํฌํ•จ ์—ฌ๋ถ€ ${fn:contains(title, "๊ณต์ง€")}
fn:startsWith(str, "prefix") ํŠน์ • ์‹œ์ž‘ ๋ฌธ์ž์—ด ๊ฒ€์‚ฌ ${fn:startsWith(id, "admin")}
fn:endsWith(str, "suffix") ํŠน์ • ๋ ๋ฌธ์ž์—ด ๊ฒ€์‚ฌ ${fn:endsWith(filename, ".jpg")}
fn:indexOf(str, "word") ์œ„์น˜ ๋ฐ˜ํ™˜ (์—†์œผ๋ฉด -1) ${fn:indexOf(email, "@")}
fn:substring(str, start, end) ๋ถ€๋ถ„ ๋ฌธ์ž์—ด ์ถ”์ถœ ${fn:substring(name, 0, 2)}
fn:replace(str, "a", "b") ๋ฌธ์ž์—ด ์น˜ํ™˜ ${fn:replace(str, "a", "*")}
fn:toLowerCase(str) ์†Œ๋ฌธ์ž๋กœ ${fn:toLowerCase(name)}
fn:toUpperCase(str) ๋Œ€๋ฌธ์ž๋กœ ${fn:toUpperCase(name)}
fn:split(str, delimiter) ๊ตฌ๋ถ„์ž๋กœ ๋‚˜๋ˆ  ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ ${fn:split(tags, ",")}
fn:join(array, delimiter) ๋ฐฐ์—ด์„ ๋ฌธ์ž์—ด๋กœ ๋ณ‘ํ•ฉ ${fn:join(hobbyList, ", ")}

4๏ธโƒฃ ์‹ค์ „ ํ™œ์šฉ ์˜ˆ์ œ

๐Ÿ”ธ ์˜ˆ์ œ 1: ์ด๋ฆ„์ด 2๊ธ€์ž ์ดํ•˜์ธ์ง€ ์ฒดํฌ

<c:if test="${fn:length(user.name) <= 2}">
  <p>์ด๋ฆ„์ด ๋„ˆ๋ฌด ์งง์Šต๋‹ˆ๋‹ค.</p>
</c:if>

๐Ÿ”ธ ์˜ˆ์ œ 2: ๊ธ€ ์ œ๋ชฉ์— โ€œ๊ณต์ง€โ€ ํฌํ•จ ์—ฌ๋ถ€ ์ฒดํฌ

<c:if test="${fn:contains(post.title, '๊ณต์ง€')}">
  <strong>[๊ณต์ง€]</strong>
</c:if>

๐Ÿ”ธ ์˜ˆ์ œ 3: ์ด๋ฏธ์ง€ ํŒŒ์ผ ํ™•์žฅ์ž ๊ฒ€์‚ฌ

<c:if test="${fn:endsWith(fileName, '.png')}">
  <img src="${fileName}" />
</c:if>

๐Ÿ”ธ ์˜ˆ์ œ 4: ํƒœ๊ทธ ๋ฌธ์ž์—ด โ†’ ๋ฆฌ์ŠคํŠธ ๋ณ€ํ™˜ ํ›„ ๋ฐ˜๋ณต ์ถœ๋ ฅ

<%-- tags = "java,jsp,jstl" --%>
<c:forEach var="tag" items="${fn:split(tags, ',')}">
  <span>#${tag}</span>
</c:forEach>

๐Ÿ”ธ ์˜ˆ์ œ 5: ์†Œ๋ฌธ์ž ์ด๋ฉ”์ผ ์ถœ๋ ฅ

<p>์ด๋ฉ”์ผ: ${fn:toLowerCase(user.email)}</p>

5๏ธโƒฃ ๊ธฐ์ˆ ๋ฉด์ ‘ ๋Œ€๋น„ ์งˆ๋ฌธ ์ •๋ฆฌ

์งˆ๋ฌธ ์˜ˆ์‹œ ๋‹ต๋ณ€ ์š”์•ฝ
โ“ JSTL์—์„œ ๋ฌธ์ž์—ด ํ•จ์ˆ˜๋Š” ์–ด๋–ป๊ฒŒ ์“ฐ๋‚˜์š”? fn: ํ•จ์ˆ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ์–ธํ•˜๊ณ  ${fn:ํ•จ์ˆ˜๋ช…(...)} ํ˜•์‹์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
โ“ fn:contains์™€ c:if๋Š” ์–ด๋–ป๊ฒŒ ์กฐํ•ฉํ•˜๋‚˜์š”? ๋ฌธ์ž์—ด ํฌํ•จ ์—ฌ๋ถ€๋ฅผ ์กฐ๊ฑด์œผ๋กœ ๋ถ„๊ธฐํ•  ๋•Œ c:if test="${fn:contains(str, 'word')}" ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
โ“ fn:split์€ ์–ด๋–ค ํƒ€์ž…์„ ๋ฐ˜ํ™˜ํ•˜๋‚˜์š”? ๋ฌธ์ž์—ด์„ ๋ฐฐ์—ด๋กœ ๋‚˜๋ˆ ์ฃผ๋ฉฐ, ์ด๋ฅผ c:forEach๋กœ ๋ฐ˜๋ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
โ“ ์ž๋ฐ”์˜ equalsIgnoreCase๋Š” JSTL์—์„œ ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜์š”? fn:toLowerCase(str1) == fn:toLowerCase(str2) ํ˜•ํƒœ๋กœ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

6๏ธโƒฃ ์š”์•ฝ ๋ฐ ๋งˆ๋ฌด๋ฆฌ

๐Ÿ“Œ JSTL ํ•จ์ˆ˜(fn:)๋Š” JSP์—์„œ ๋ฌธ์ž์—ด, ๋ฐฐ์—ด, ๋ฆฌ์ŠคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ๊ผญ ํ•„์š”ํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

ํŠนํžˆ fn:length, fn:contains, fn:split ๋“ฑ์€ ์กฐ๊ฑด๋ฌธ, ๋ฐ˜๋ณต๋ฌธ๊ณผ ์กฐํ•ฉํ•˜๋ฉด ์‹ค๋ฌด์—์„œ ์ž์ฃผ ์“ฐ์ž…๋‹ˆ๋‹ค.

  • ๋ฌธ์ž์—ด ๊ธธ์ด, ํฌํ•จ, ์‹œ์ž‘/๋, ์น˜ํ™˜, ๋‚˜๋ˆ„๊ธฐ ๋“ฑ ๋Œ€๋ถ€๋ถ„ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅ
  • ์ž๋ฐ” ์ฝ”๋“œ ์—†์ด ํ‘œํ˜„ ๊ฐ€๋Šฅ โ†’ View ์˜์—ญ ์—ญํ•  ์ถฉ์‹ค
  • ๊ธฐ์ˆ ๋ฉด์ ‘์—์„œ JSTL ๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ ๋ฐฉ์‹ ๋น„๊ต ๋ฌธ์ œ๋กœ๋„ ์ž์ฃผ ๋“ฑ์žฅ