** ๐Ÿ“Œ PART 3.1 JSP โ†’ ์„œ๋ธ”๋ฆฟ ๋ณ€ํ™˜ ๊ณผ์ • + ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ ๋ถ„์„ **


๐ŸŸข 1๋‹จ๊ณ„. JSP๋Š” ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ• ๊นŒ? (๊ธฐ์ดˆ ์„ค๋ช…)

๐Ÿ“„ JSP๋Š” ๊ทธ๋ƒฅ HTML ํŒŒ์ผ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ, ์‚ฌ์‹ค์€

๋ฐฑ์—”๋“œ์—์„œ ๋™์ ์œผ๋กœ HTML์„ ๋งŒ๋“œ๋Š” โ€œ์ž๋ฐ” ์ฝ”๋“œโ€๋กœ ๋ณ€ํ™˜๋ผ.


โœ… JSP ์‹คํ–‰ ์ˆœ์„œ ์š”์•ฝ

[JSP ํŒŒ์ผ ์š”์ฒญ]
 โ†’ [์„œ๋ฒ„๊ฐ€ JSP๋ฅผ "์„œ๋ธ”๋ฆฟ"์œผ๋กœ ๋ฐ”๊ฟˆ (.java ํŒŒ์ผ ์ƒ์„ฑ)]
 โ†’ [๊ทธ .java๋ฅผ ์ปดํŒŒ์ผํ•ด์„œ .class๋กœ ๋งŒ๋“ฆ]
 โ†’ [๊ทธ .class ํŒŒ์ผ์„ ์‹คํ–‰ํ•ด์„œ HTML์„ ์ถœ๋ ฅ]

๐Ÿ” ์˜ˆ์‹œ

JSP ์ฝ”๋“œ:

<% out.println("์•ˆ๋…•ํ•˜์„ธ์š”!"); %>

โ†’ ๋‚ด๋ถ€์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„œ๋ธ”๋ฆฟ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜๋จ:

public void _jspService(HttpServletRequest request, HttpServletResponse response) {
    response.getWriter().write("์•ˆ๋…•ํ•˜์„ธ์š”!");
}

๐Ÿง  2๋‹จ๊ณ„. JSP โ†’ ์„œ๋ธ”๋ฆฟ ๋ณ€ํ™˜ ํƒ€์ด๋ฐ (2๊ฐ€์ง€ ๋ฐฉ์‹)

๋ฐฉ์‹ ์„ค๋ช… ์‹ค๋ฌด ํฌ์ธํŠธ
์ตœ์ดˆ ์š”์ฒญ ์‹œ JSP๋ฅผ ์ฒ˜์Œ ์š”์ฒญํ•  ๋•Œ โ†’ ๋ณ€ํ™˜๋จ ๊ธฐ๋ณธ ์„ค์ •
์„œ๋ฒ„ ๋ฐฐํฌ ์‹œ (precompile) WAR ๋ฐฐํฌํ•  ๋•Œ ๋ฏธ๋ฆฌ ์„œ๋ธ”๋ฆฟ์œผ๋กœ ๋ณ€ํ™˜ ๋Œ€๊ทœ๋ชจ ์„œ๋น„์Šค์—์„œ ์ถ”์ฒœ

๐Ÿ’ก ์™œ precompile์ด ์ข‹์„๊นŒ?

์ฒซ ์‚ฌ์šฉ์ž๊ฐ€ ๋А๋ฆฌ์ง€ ์•Š๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด, ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผํ•ด๋‘๋Š” ์ „๋žต

โ†’ ์š”์ฒญ ํญ์ฃผ ์ดˆ๊ธฐ ์ง€์—ฐ์„ ๋ฐฉ์ง€


๐Ÿงฌ 3๋‹จ๊ณ„. _jspService() ๊ตฌ์กฐ ๋ถ„์„

JSP๊ฐ€ ์„œ๋ธ”๋ฆฟ์œผ๋กœ ๋ฐ”๋€Œ๋ฉด ๋‚ด๋ถ€์— _jspService() ๋ฉ”์„œ๋“œ๊ฐ€ ์ž๋™ ์ƒ์„ฑ๋จ.


โœ… ์˜ˆ์‹œ ๊ตฌ์กฐ

public final class test_jsp extends HttpJspBase {
    public void _jspService(HttpServletRequest request, HttpServletResponse response) {
        response.setContentType("text/html;charset=UTF-8");
        JspWriter out = response.getWriter();

        out.write("<html><body>");
        out.write("์•ˆ๋…•ํ•˜์„ธ์š”!");
        out.write("</body></html>");
    }
}

๐Ÿ’ก ํŠน์ง•

ํ•ญ๋ชฉ ์„ค๋ช…
๋ฉ”์„œ๋“œ ์ด๋ฆ„ _jspService() (JSP ์ „์šฉ ๋ฉ”์„œ๋“œ)
ํ˜ธ์ถœ ๋ฐฉ์‹ ์‚ฌ์šฉ์ž๊ฐ€ JSP๋ฅผ ์š”์ฒญํ•  ๋•Œ๋งˆ๋‹ค ์ž๋™ ํ˜ธ์ถœ
์‚ฌ์šฉ ๊ฐ์ฒด request, response, out, session ๋“ฑ JSP ๋‚ด์žฅ ๊ฐ์ฒด ์ „๋ถ€ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
์žฌ์ •์˜ ๋ถˆ๊ฐ€ ์ด ๋ฉ”์„œ๋“œ๋Š” ์˜ค๋ฒ„๋ผ์ด๋“œํ•  ์ˆ˜ ์—†์Œ (JSP ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ž๋™ ์ƒ์„ฑ๋จ)

๐Ÿ’พ 4๋‹จ๊ณ„. JSP๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์–ด๋–ป๊ฒŒ ๋ณด๊ด€๋ ๊นŒ?


โœ… ์‹คํ–‰ ํŒŒ์ผ ์ƒ์„ฑ ์œ„์น˜

ํŒŒ์ผ ์œ„์น˜ (Tomcat ๊ธฐ์ค€)
.java /work/Catalina/localhost/ํ”„๋กœ์ ํŠธ๋ช…/org/apache/jsp/
.class ๊ฐ™์€ ๊ฒฝ๋กœ, ์ปดํŒŒ์ผ๋œ ํŒŒ์ผ (.class)

โ†’ ์ด ํŒŒ์ผ์€ Tomcat์ด JSP๋ฅผ ๋ณ€ํ™˜ํ•ด์„œ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•จ


โœ… ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ

๊ตฌ์กฐ ์„ค๋ช…
ํด๋ž˜์Šค ์˜์—ญ _jspService() ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง„ ํด๋ž˜์Šค๊ฐ€ ์˜ฌ๋ผ๊ฐ
ํž™ ์˜์—ญ request, session, out ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋จ
์Šคํƒ ์˜์—ญ ๊ฐ ์š”์ฒญ๋ณ„๋กœ ์ง€์—ญ๋ณ€์ˆ˜ ์ €์žฅ (JSP ์‹คํ–‰ ์‹œ)

๐Ÿ“Œ GC ๊ด€์ 


โœ… ์š”์•ฝ: JSP ์‹คํ–‰ ํ๋ฆ„ ํ•œ๋ˆˆ์— ๋ณด๊ธฐ

[JSP ์š”์ฒญ]
โ†’ [JSP โ†’ ์„œ๋ธ”๋ฆฟ์œผ๋กœ ๋ณ€ํ™˜ (.java)]
โ†’ [.java โ†’ .class ์ปดํŒŒ์ผ]
โ†’ [ํด๋ž˜์Šค ๋ฉ”๋ชจ๋ฆฌ์— ์ ์žฌ]
โ†’ [_jspService() ์‹คํ–‰ โ†’ HTML ์ถœ๋ ฅ]
โ†’ [์‘๋‹ต ์ข…๋ฃŒ โ†’ ์ผ๋ถ€ ๊ฐ์ฒด๋Š” GC ๋Œ€์ƒ]

๐ŸŽฏ ์‹ค๋ฌด ์„ฑ๋Šฅ ๊ณ ๋ ค์‚ฌํ•ญ

ํ•ญ๋ชฉ ์„ค๋ช…
JSP precompile ์‚ฌ์šฉ ๋Œ€๋Ÿ‰ ํŠธ๋ž˜ํ”ฝ ๋Œ€๋น„ ๊ฐ€๋Šฅ
๋„ˆ๋ฌด ๋งŽ์€ JSP ํŒŒ์ผ ํด๋ž˜์Šค ํŒŒ์ผ์ด ๋งŽ์•„์ ธ PermGen/Metaspace ๋ˆ„์ˆ˜ ๊ฐ€๋Šฅ
out.write() ๋ฐ˜๋ณต BufferedWriter ๊ธฐ๋ฐ˜์ด๋ฏ€๋กœ flush ์‹œ๊ธฐ ์ค‘์š”
HTML์ด ๋ณต์žกํ• ์ˆ˜๋ก _jspService()์˜ ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์ง€๊ณ , ์„ฑ๋Šฅ ์ €ํ•˜ ์šฐ๋ ค ์žˆ์Œ

๐Ÿ’ก ๋ฉด์ ‘ ์˜ˆ์ƒ ์งˆ๋ฌธ

  1. JSP๋Š” ์–ด๋–ป๊ฒŒ ์„œ๋ธ”๋ฆฟ์œผ๋กœ ๋ฐ”๋€Œ๋‚˜์š”?
  2. JSP๊ฐ€ ์„œ๋ธ”๋ฆฟ์œผ๋กœ ๋ณ€ํ™˜๋˜๋Š” ํƒ€์ด๋ฐ์€ ์–ธ์ œ์ธ๊ฐ€์š”?
  3. JSP ๋‚ด์˜ <% %> ์ฝ”๋“œ๋Š” ์–ด๋–ค ์ž๋ฐ” ๋ฉ”์„œ๋“œ๋กœ ๋“ค์–ด๊ฐ€๋‚˜์š”?
  4. JSP ํŒŒ์ผ์ด ๋งŽ์„ ๋•Œ ์„œ๋ฒ„ ์„ฑ๋Šฅ์— ์–ด๋–ค ์˜ํ–ฅ์ด ์žˆ๋‚˜์š”?
  5. JSP๋ฅผ precompileํ•˜๋ฉด ์–ด๋–ค ์žฅ์ ์ด ์žˆ๋‚˜์š”?

โœ… ๋งˆ๋ฌด๋ฆฌ ์š”์•ฝํ‘œ

ํ•ญ๋ชฉ ์„ค๋ช…
JSP ๋ณ€ํ™˜ ์‹œ์  ์ตœ์ดˆ ์š”์ฒญ ์‹œ or ๋ฐฐํฌ ์‹œ (precompile)
ํ•ต์‹ฌ ๋ฉ”์„œ๋“œ _jspService() (JSP๊ฐ€ ์„œ๋ธ”๋ฆฟ์ด ๋˜๋ฉด ์ž๋™ ์ƒ์„ฑ)
๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜ ํด๋ž˜์Šค ์˜์—ญ(์ฝ”๋“œ), ํž™ ์˜์—ญ(๊ฐ์ฒด), ์Šคํƒ ์˜์—ญ(์ง€์—ญ ๋ณ€์ˆ˜)
GC ๋Œ€์ƒ ์š”์ฒญ ์ข…๋ฃŒ ํ›„, request/response ๊ฐ์ฒด ๋“ฑ์€ GC ์ˆ˜๊ฑฐ๋จ

โœ… PART 3.2 ํƒœ๊ทธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(JSTL)์˜ ๋ฉ”๋ชจ๋ฆฌ ํŠน์ง•


๐ŸŸข 1๋‹จ๊ณ„. ํƒœ๊ทธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋ญ์•ผ?

๐Ÿ’ฌ ํƒœ๊ทธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” JSP์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ ๋Œ€์‹  ์“ฐ๋Š” ๋„๊ตฌ์•ผ.

์–ด๋ ค์šด Java ์ฝ”๋“œ๋ฅผ ์•ˆ ์“ฐ๊ณ , <c:if> ๊ฐ™์€ HTML์ฒ˜๋Ÿผ ์ƒ๊ธด ๋ช…๋ น์–ด๋ฅผ ์“ฐ๋Š” ๊ฑฐ์ง€!


โœ… ์˜ˆ์‹œ: JSTL ํƒœ๊ทธ

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

<c:if test="${loginId != null}">
  <p>${loginId}๋‹˜ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!</p>
</c:if>

์ด๊ฑด ์ž๋ฐ” ์ฝ”๋“œ๋กœ ์“ฐ๋ฉด if(loginId != null) { โ€ฆ } ์™€ ๊ฐ™์€ ์—ญํ• ์ด์•ผ.


๐Ÿง  JSTL ํƒœ๊ทธ๋„ ๊ฒฐ๊ตญ์€ Java ๊ฐ์ฒด๋‹ค!


๐Ÿ” 2๋‹จ๊ณ„. ํƒœ๊ทธ ๊ฐ์ฒด๊ฐ€ ๋งค ์š”์ฒญ๋งˆ๋‹ค ์ƒ์„ฑ๋˜๋Š” ๊ตฌ์กฐ ์„ค๋ช…

๐Ÿ“ฆ JSP ์‹คํ–‰ ํ๋ฆ„ ์š”์•ฝ

[์‚ฌ์šฉ์ž๊ฐ€ JSP๋ฅผ ์š”์ฒญํ•จ]
โ†’ JSP ๋‚ด๋ถ€์˜ `<c:if>`, `<c:forEach>` ๋“ฑ ํƒœ๊ทธ ๋ฐœ๊ฒฌ๋จ
โ†’ ๊ฐ๊ฐ์— ๋Œ€์‘ํ•˜๋Š” Java ํƒœ๊ทธ ํด๋ž˜์Šค๊ฐ€ ์ƒ์„ฑ๋จ (Tag ๊ฐ์ฒด)
โ†’ ์กฐ๊ฑด ์ฒ˜๋ฆฌ ๋˜๋Š” ๋ฐ˜๋ณต ์ˆ˜ํ–‰ ํ›„, HTML๋กœ ๋ณ€ํ™˜๋จ

โœ… ๊ตฌ์กฐ๋„ ์˜ˆ์‹œ

<jsp>
  <c:forEach>  โ† ForEachTag ๊ฐ์ฒด ์ƒ์„ฑ๋จ
    <c:if>     โ† IfTag ๊ฐ์ฒด ์ƒ์„ฑ๋จ
      ...
    </c:if>
  </c:forEach>
</jsp>

๐Ÿง  ๋ฉ”๋ชจ๋ฆฌ์ ์œผ๋กœ ์ค‘์š”ํ•œ ์ 

ํ•ญ๋ชฉ ์„ค๋ช…
ํƒœ๊ทธ ๊ฐ์ฒด JSP ์‹คํ–‰ ์‹œ ๋งค๋ฒˆ ์ƒ์„ฑ๋จ
๋ฒ”์œ„ request๊ฐ€ ๋๋‚  ๋•Œ ์‚ฌ๋ผ์ง
GC ๋Œ€์ƒ JSP ์‘๋‹ต์ด ๋๋‚˜๋ฉด GC๊ฐ€ ํšŒ์ˆ˜ํ•จ

โ†’ ์ฆ‰, ๋ชจ๋“  JSTL ํƒœ๊ทธ ๊ฐ์ฒด๋Š” ์š”์ฒญ๋งˆ๋‹ค ์ƒ์„ฑ๋จ โ†’ GC๊ฐ€ ์ž๋™ ํšŒ์ˆ˜


โœจ 3๋‹จ๊ณ„. ์‚ฌ์šฉ์ž ์ •์˜ ํƒœ๊ทธ(TagLib)์˜ ๋ฉ”๋ชจ๋ฆฌ ์žฌ์‚ฌ์šฉ ์ „๋žต


โœ… ์‚ฌ์šฉ์ž ์ •์˜ ํƒœ๊ทธ๋ž€?

๐Ÿ’ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๋งŒ๋“  ํƒœ๊ทธ์•ผ!

์˜ˆ๋ฅผ ๋“ค์–ด, <my:dateFormat /> ๊ฐ™์€ ๊ฑธ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด.


โœ… ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ• (๊ธฐ์ดˆ ๊ตฌ์กฐ)

  1. ํƒœ๊ทธ ํ•ธ๋“ค๋Ÿฌ ํด๋ž˜์Šค ๋งŒ๋“ค๊ธฐ (TagSupport ์ƒ์†)
  2. doStartTag(), doEndTag() ๋“ฑ ๋ฉ”์„œ๋“œ ๊ตฌํ˜„
  3. .tld ํŒŒ์ผ๋กœ ํƒœ๊ทธ ์ •์˜
  4. JSP์—์„œ @taglib์œผ๋กœ ๋ถˆ๋Ÿฌ์™€์„œ ์‚ฌ์šฉ

๐Ÿ“ฆ ์˜ˆ์‹œ

1. Java ํด๋ž˜์Šค

public class HelloTag extends TagSupport {
    public int doStartTag() {
        try {
            pageContext.getOut().println("์•ˆ๋…•ํ•˜์„ธ์š”!");
        } catch(Exception e) {}
        return SKIP_BODY;
    }
}

2. JSP์—์„œ ์‚ฌ์šฉ

<%@ taglib prefix="my" uri="/WEB-INF/tlds/mytag.tld" %>
<my:hello />

๐Ÿง  ์‚ฌ์šฉ์ž ํƒœ๊ทธ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ• ๊นŒ?

์ •๋‹ต: JSP ์ปจํ…Œ์ด๋„ˆ์— ๋”ฐ๋ผ ๋‹ค๋ฆ„!

๊ตฌ์กฐ ์„ค๋ช…
๊ธฐ๋ณธ ๋™์ž‘ ๋งค ์š”์ฒญ๋งˆ๋‹ค ํƒœ๊ทธ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋จ
์ตœ์ ํ™” ์ „๋žต ํƒœ๊ทธ ๊ฐ์ฒด๋ฅผ ํ’€(Pool) ๋กœ ๊ด€๋ฆฌํ•ด์„œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ (Tomcat ๊ธฐ๋ณธ ์ตœ์ ํ™”)
์กฐ๊ฑด ํƒœ๊ทธ๊ฐ€ ์ƒํƒœ(state)๋ฅผ ๊ฐ€์ง€์ง€ ์•Š์•„์•ผ ํ•จ (์ฆ‰, ์“ฐ๋ ˆ๋“œ ์„ธ์ดํ”„)

โœ… ์‹ค๋ฌด ์ „๋žต

์ „๋žต ์„ค๋ช…
ํƒœ๊ทธ ํ•ธ๋“ค๋Ÿฌ์— ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜ ์‚ฌ์šฉ ๊ธˆ์ง€ ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๊ฐ’์ด ์„ž์ผ ์ˆ˜ ์žˆ์Œ
์ƒํƒœ ์—†๋Š” ํƒœ๊ทธ ๊ตฌํ˜„ ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ด์„œ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจโ†‘
๋ณต์žกํ•œ ํƒœ๊ทธ๋Š” SimpleTagSupport ์‚ฌ์šฉ ๋” ๊ฐ€๋ณ๊ณ  ๊น”๋”ํ•œ ๊ตฌ์กฐ ์ œ๊ณต

๐Ÿง  4๋‹จ๊ณ„. ๋ฉด์ ‘ ํฌ์ธํŠธ ์ •๋ฆฌ

์งˆ๋ฌธ ์ข‹์€ ๋‹ต๋ณ€ ํฌ์ธํŠธ
JSTL ํƒœ๊ทธ ๊ฐ์ฒด๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌ๋˜๋‚˜์š”? ๋งค ์š”์ฒญ๋งˆ๋‹ค ์ƒ์„ฑ๋˜๊ณ , ์š”์ฒญ ์ข…๋ฃŒ ํ›„ GC ๋Œ€์ƒ์ž…๋‹ˆ๋‹ค.
์‚ฌ์šฉ์ž ์ •์˜ ํƒœ๊ทธ ๊ฐ์ฒด๋Š” ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ๊ฐ€์š”? ์ƒํƒœ๊ฐ€ ์—†๋‹ค๋ฉด, ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํƒœ๊ทธ ๊ฐ์ฒด๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํƒœ๊ทธ ๊ฐ์ฒด๊ฐ€ ๋งŽ์•„์ง€๋ฉด ์„ฑ๋Šฅ์— ์˜ํ–ฅ ์žˆ๋‚˜์š”? ๋งŽ์„์ˆ˜๋ก GC ๋ถ€๋‹ด์ด ์ฆ๊ฐ€ํ•˜๋ฉฐ, ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๊ฐ€ ์ข‹์Šต๋‹ˆ๋‹ค.
์‚ฌ์šฉ์ž ํƒœ๊ทธ๋ฅผ ๋งŒ๋“ค ๋•Œ ์ฃผ์˜์ ์€? ์“ฐ๋ ˆ๋“œ ์•ˆ์ „์„ฑ ํ™•๋ณด (์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜ ์‚ฌ์šฉ ๊ธˆ์ง€)

โœ… ๋งˆ๋ฌด๋ฆฌ ์š”์•ฝํ‘œ

ํ•ญ๋ชฉ ์„ค๋ช… ๋ฉ”๋ชจ๋ฆฌ ์˜ํ–ฅ
JSTL ํƒœ๊ทธ ๋งค ์š”์ฒญ ์‹œ ์ƒˆ ๊ฐ์ฒด ์ƒ์„ฑ GC ๋Œ€์ƒ (์งง์€ ์ƒ๋ช…์ฃผ๊ธฐ)
์‚ฌ์šฉ์ž ํƒœ๊ทธ ๊ธฐ๋ณธ์€ ๋งค ์š”์ฒญ๋งˆ๋‹ค ์ƒ์„ฑ ํ’€๋กœ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ (์ตœ์ ํ™” ์‹œ)
ํƒœ๊ทธ ์žฌ์‚ฌ์šฉ ์กฐ๊ฑด ์ƒํƒœ ์—†์Œ (stateless) ๋ฉ”๋ชจ๋ฆฌ ์ ˆ์•ฝ & ์„ฑ๋Šฅ ํ–ฅ์ƒ

โœ… PART 3.3 EL ํ‘œํ˜„์‹๊ณผ ๋ฉ”๋ชจ๋ฆฌ (์ค‘ํ•™์ƒ๋„ ์ดํ•ดํ•˜๋Š” ๊ต์ˆ˜๊ธ‰ ์„ค๋ช…)


๐ŸŸข 1๋‹จ๊ณ„. EL(Expression Language)์ด ๋ญ์•ผ?

๐Ÿ’ฌ EL์€ JSP์—์„œ ${๋ณ€์ˆ˜๋ช…}์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•œ ํ‘œํ˜„์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•˜๊ฑฐ๋‚˜ ๋น„๊ตํ•˜๋Š” ์–ธ์–ด์•ผ.

request.getAttribute("id") ๋Œ€์‹  ${id}๋งŒ ์“ฐ๋ฉด ๋จ!


โœ… ์˜ˆ์‹œ

<% request.setAttribute("name", "ํ™๊ธธ๋™"); %>
<p>์ด๋ฆ„: ${name}</p>

๐Ÿ‘‰ EL์€ ์œ„์—์„œ request, session ๋“ฑ์˜ ๋‚ด์žฅ ๊ฐ์ฒด์—์„œ ๊ฐ’์„ ์ž๋™์œผ๋กœ ์ฐพ์•„์ค˜!


๐Ÿ” ์ฐพ๋Š” ์ˆœ์„œ(์šฐ์„ ์ˆœ์œ„): EL ์Šค์ฝ”ํ”„ ํƒ์ƒ‰ ์ˆœ์„œ

์šฐ์„ ์ˆœ์œ„ ์Šค์ฝ”ํ”„ ์„ค๋ช…
1 PageScope ํ˜„์žฌ ํŽ˜์ด์ง€ ์•ˆ์—์„œ๋งŒ
2 RequestScope ์š”์ฒญ(request) ๋™์•ˆ๋งŒ
3 SessionScope ๋กœ๊ทธ์ธ ์œ ์ง€์šฉ
4 ApplicationScope ์„œ๋ฒ„ ์ „์ฒด ๊ณต์šฉ

โœ… ์ด ์ˆœ์„œ๋Œ€๋กœ ๋ณ€์ˆ˜ ์ฐพ๊ณ , ๋จผ์ € ์ฐพ์€ ๊ฑธ ์‚ฌ์šฉํ•จ!


๐Ÿ”ง 2๋‹จ๊ณ„. EL ๋‚ด๋ถ€ ๋™์ž‘๊ณผ ์บ์‹ฑ ๊ตฌ์กฐ


๐Ÿ’ฌ ์‚ฌ์šฉ์ž๊ฐ€ ${member.name}์ฒ˜๋Ÿผ EL์„ ์ผ์„ ๋•Œ ์„œ๋ฒ„ ์•ˆ์—์„œ๋Š”?

๐Ÿ“ฆ ๋‚ด๋ถ€ ๋™์ž‘ ์š”์•ฝ

1. EL ํŒŒ์„œ๊ฐ€ EL ํ‘œํ˜„์‹ ํŒŒ์•…ํ•จ โ†’ "${member.name}"
2. PageScope โ†’ RequestScope โ†’ Session โ†’ ApplicationScope ์ฐจ๋ก€๋กœ ํƒ์ƒ‰
3. member ๊ฐ์ฒด๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด โ†’ getName() ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ
4. ๊ฒฐ๊ณผ ๊ฐ’์„ HTML๋กœ ์ถœ๋ ฅ

๐Ÿง  EL์€ ๋งค ์š”์ฒญ๋งˆ๋‹ค ํŒŒ์‹ฑํ•˜์ง€ ์•Š๋Š”๋‹ค!

EL์€ ์„ฑ๋Šฅ์„ ์œ„ํ•ด ๋‚ด๋ถ€์ ์œผ๋กœ ํ‘œํ˜„์‹์„ ์บ์‹ฑํ•จ.

โ†’ ์ž์ฃผ ์“ฐ๋Š” ${member.name} ๊ฐ™์€ ํ‘œํ˜„์€ ๋ฏธ๋ฆฌ ๋ถ„์„ํ•ด๋‘๊ณ  ์žฌ์‚ฌ์šฉํ•จ.


โœ… ์บ์‹ฑ ๊ตฌ์กฐ์˜ ํšจ๊ณผ

ํ•ญ๋ชฉ ์„ค๋ช…
๋น ๋ฆ„ ๊ฐ™์€ ํ‘œํ˜„์‹์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์“ฐ๋ฉด ํŒŒ์‹ฑ ์ƒ๋žต
๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ โ†‘ ๋ถ„์„ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ฒด๋กœ ๋งŒ๋“ค์–ด ์žฌ์‚ฌ์šฉ
์‹ค๋ฌด ํŒ ๋ณต์žกํ•œ EL์€ ๋ณ€์ˆ˜๋กœ ๋ถ„๋ฆฌํ•ด์„œ ์บ์‹ฑ ํšจ๊ณผ ๊ทน๋Œ€ํ™” ๊ฐ€๋Šฅ

๐Ÿง  GC ๊ด€์  ์„ค๋ช…


๐Ÿ”„ 3๋‹จ๊ณ„. <c:forEach> vs ์ผ๋ฐ˜ for๋ฌธ ๋ฉ”๋ชจ๋ฆฌ ์ฐจ์ด


โœ… ์˜ˆ์‹œ ๋น„๊ต

1. JSTL ๋ฐฉ์‹ (<c:forEach>)

<c:forEach var="item" items="${list}">
  <p>${item.name}</p>
</c:forEach>

2. ์Šคํฌ๋ฆฝํ‹€๋ฆฟ ๋ฐฉ์‹ (for๋ฌธ)

<%
  for(Member m : list) {
%>
  <p><%= m.getName() %></p>
<%
  }
%>

โœ… ๋ฉ”๋ชจ๋ฆฌ ๋น„๊ต

ํ•ญ๋ชฉ <c:forEach> ์ž๋ฐ” for๋ฌธ (<% %>)
ํƒœ๊ทธ ๊ฐ์ฒด ์ƒ์„ฑ ForEachTag ๊ฐ์ฒด ์ƒ์„ฑ ์—†์Œ (๋‹จ์ˆœ ๋ฃจํ”„)
์†๋„ ์•ฝ๊ฐ„ ๋А๋ฆผ (๋ฐ˜๋ณต๋งˆ๋‹ค ํƒœ๊ทธ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ) ๋น ๋ฆ„
๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ JSP ๋‚ด์—์„œ ํƒœ๊ทธ ๊ฐ์ฒด, ๋ฐ˜๋ณต ๋ณ€์ˆ˜๋ฅผ ๋งค๋ฒˆ ์ƒ์„ฑ ์ง€์—ญ ๋ณ€์ˆ˜๋งŒ ์‚ฌ์šฉ
GC ์˜ํ–ฅ ๊ฐ์ฒด ์ˆ˜ ๋งŽ์œผ๋ฉด GC ์••๋ฐ• โ†‘ ๊ฑฐ์˜ ์—†์Œ
๊ฐ€๋…์„ฑ ๋†’์Œ (HTML์— ๊ฐ€๊น๊ณ  ๋ช…ํ™•) ๋‚ฎ์Œ (Java ์ฝ”๋“œ ์„ž์ž„)
๋ฉ€ํ‹ฐ ๊ฐœ๋ฐœ์ž ํ™˜๊ฒฝ ๐Ÿ‘ ๋””์ž์ด๋„ˆ์™€ ํ˜‘์—… ์‰ฌ์›€ ์–ด๋ ค์›€

๐Ÿง  ์‹ค๋ฌด ์ตœ์ ํ™” ์ „๋žต


๐ŸŽ“ 4๋‹จ๊ณ„. ๋ฉด์ ‘ ํฌ์ธํŠธ ์ •๋ฆฌ

์งˆ๋ฌธ ์ข‹์€ ๋‹ต๋ณ€ ํฌ์ธํŠธ
EL์€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋‚˜์š”? 4๋‹จ๊ณ„ ์Šค์ฝ”ํ”„ ํƒ์ƒ‰ โ†’ getter ์‹คํ–‰ โ†’ HTML ์ถœ๋ ฅ
EL์€ ๋งค๋ฒˆ ์ƒˆ๋กœ ํŒŒ์‹ฑํ•˜๋‚˜์š”? ์•„๋‹ˆ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ ํŒŒ์‹ฑ ์บ์‹ฑ ๊ตฌ์กฐ๊ฐ€ ์žˆ์Œ
<c:forEach>๋Š” ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ด ์ข‹์€๊ฐ€์š”? ๊ฐ€๋…์„ฑ์€ ์ข‹์ง€๋งŒ ๋ฐ˜๋ณต ์‹œ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜์–ด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์€ ์žˆ์Œ
forEach์™€ for ์ค‘ ์„ฑ๋Šฅ ์ข‹์€ ๊ฑด? ์ˆœ์ˆ˜ Java for๋ฌธ์ด ๋น ๋ฆ„. ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ถœ๋ ฅ ์‹œ ๊ณ ๋ ค
EL์ด GC์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์€? EL ์ž์ฒด๋Š” JSP ํด๋ž˜์Šค์— ๋‚จ์•„์žˆ๊ณ , ์ฐธ์กฐ ๊ฐ์ฒด๊ฐ€ ์‚ฌ๋ผ์ง€๋ฉด GC ๊ฐ€๋Šฅ

โœ… ๋งˆ๋ฌด๋ฆฌ ์š”์•ฝํ‘œ

ํ•ญ๋ชฉ ์„ค๋ช…
EL ์บ์‹ฑ ๊ตฌ์กฐ ์ž์ฃผ ์“ฐ๋Š” ํ‘œํ˜„์€ ํŒŒ์‹ฑ ๊ฒฐ๊ณผ ์žฌ์‚ฌ์šฉ
EL ํƒ์ƒ‰ ์ˆœ์„œ Page โ†’ Request โ†’ Session โ†’ Application
<c:forEach> ๋ฐ˜๋ณต ์‹œ ํƒœ๊ทธ ๊ฐ์ฒด ๋งค๋ฒˆ ์ƒ์„ฑ (๊ฐ€๋…์„ฑ ๐Ÿ‘, ์„ฑ๋Šฅ์€ ๋А๋ฆด ์ˆ˜ ์žˆ์Œ)
์ผ๋ฐ˜ for๋ฌธ ๋น ๋ฅด์ง€๋งŒ ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ ์–ด๋ ค์›€