** ๐Ÿ“Œ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ (JavaScript + ์„œ๋ฒ„ ์ธก ๊ฒ€์‚ฌ ๋ณ‘ํ–‰) **

์‚ฌ์šฉ์ž ์ž…๋ ฅ๊ฐ’์„ ์ •ํ™•ํ•˜๊ฒŒ ๊ฒ€์ฆํ•˜์—ฌ ์•ˆ์ •์ ์ด๊ณ  ์•ˆ์ „ํ•œ ์›น ์„œ๋น„์Šค ๋งŒ๋“ค๊ธฐ

JavaScript์™€ Java(Servlet)์˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋ณ‘ํ–‰ ์ฒ˜๋ฆฌ ํ๋ฆ„ ์™„์ „ ์ •๋ฆฌ


๐Ÿงฉ ๋ชฉ์ฐจ

  1. ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ž€?
  2. ํด๋ผ์ด์–ธํŠธ vs ์„œ๋ฒ„ ์œ ํšจ์„ฑ ๋น„๊ต
  3. JavaScript ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์˜ˆ์ œ
  4. ์„œ๋ฒ„ ์ธก ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์˜ˆ์ œ
  5. ๋ณ‘ํ–‰ ์ฒ˜๋ฆฌ ํ๋ฆ„๋„
  6. ์‹ค์ „ ์˜ˆ์ œ ํ๋ฆ„
  7. ๊ธฐ์ˆ  ๋ฉด์ ‘ ๋Œ€๋น„ ํ•ต์‹ฌ ์š”์•ฝ
  8. ๋งˆ๋ฌด๋ฆฌ ์š”์•ฝ + Notion ์ž‘์„ฑ ํŒ

โœ… 1. ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ž€?

ํ•ญ๋ชฉ ์„ค๋ช…
์ •์˜ ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ๊ฐ’์ด ๋นˆ๊ฐ’, ํ˜•์‹ ์˜ค๋ฅ˜, ๋ฒ”์œ„ ์˜ค๋ฅ˜ ์—†์ด ์ •์ƒ์ธ์ง€ ํ™•์ธํ•˜๋Š” ์ ˆ์ฐจ
๋ชฉ์  ์„œ๋น„์Šค์˜ ์•ˆ์ •์„ฑ ํ™•๋ณด, ๋ณด์•ˆ ๋ฌธ์ œ ๋ฐฉ์ง€ (SQL Injection, ์ž˜๋ชป๋œ ์ž…๋ ฅ ์ฐจ๋‹จ ๋“ฑ)
์ ์šฉ ์œ„์น˜ ํด๋ผ์ด์–ธํŠธ(JavaScript) + ์„œ๋ฒ„(Servlet) ์–‘์ชฝ ๋ชจ๋‘์—์„œ ์ง„ํ–‰ ํ•„์š”

โœ… 2. ํด๋ผ์ด์–ธํŠธ vs ์„œ๋ฒ„ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋น„๊ต

๊ตฌ๋ถ„ ํด๋ผ์ด์–ธํŠธ ์ธก (JS) ์„œ๋ฒ„ ์ธก (Servlet)
๊ฒ€์‚ฌ ์œ„์น˜ ๋ธŒ๋ผ์šฐ์ € ์„œ๋ฒ„ ๋‚ด๋ถ€
์†๋„ ๋น ๋ฆ„ (์ž…๋ ฅ ์ฆ‰์‹œ ๋ฐ˜์‘) ์ƒ๋Œ€์ ์œผ๋กœ ๋А๋ฆผ
๋ณด์•ˆ์„ฑ ๋‚ฎ์Œ (JS ๊บผ์ง ๊ฐ€๋Šฅ) ๋†’์Œ
ํ•„์ˆ˜ ์—ฌ๋ถ€ ํŽธ์˜์„ฑ ์ค‘์‹ฌ ๋ณด์•ˆ์ƒ ๋ฐ˜๋“œ์‹œ ํ•„์š”

๐Ÿ“Œ ๋‘˜ ๋‹ค ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ํ•จ!

โ†’ JS๋Š” ๋น ๋ฅด๊ณ  ํŽธ๋ฆฌํ•œ ํ™•์ธ์šฉ, ์„œ๋ฒ„๋Š” ์ง„์งœ ํ•„์ˆ˜ ๋ณด์•ˆ ๋ฐฉ์–ด์šฉ!


โœ… 3. JavaScript ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์˜ˆ์ œโœ๏ธ

๐Ÿ“„ form.jsp

<script>
function validateForm() {
  const title = document.getElementById("title").value;
  const content = document.getElementById("content").value;

  if (title.trim() === "") {
    alert("์ œ๋ชฉ์„ ์ž…๋ ฅํ•˜์„ธ์š”!");
    return false;
  }
  if (content.trim() === "") {
    alert("๋‚ด์šฉ์„ ์ž…๋ ฅํ•˜์„ธ์š”!");
    return false;
  }
  return true;
}
</script>

<form action="save" method="post" onsubmit="return validateForm()">
  ์ œ๋ชฉ: <input type="text" name="title" id="title"><br>
  ๋‚ด์šฉ: <textarea name="content" id="content"></textarea><br>
  <input type="submit" value="์ €์žฅ">
</form>

โœ… 4. ์„œ๋ฒ„ ์ธก ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์˜ˆ์ œ (Servlet)

๐Ÿ“„ SaveServlet.java

protected void doPost(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException {

  req.setCharacterEncoding("UTF-8");

  String title = req.getParameter("title");
  String content = req.getParameter("content");

  // ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
  if (title == null || title.trim().equals("") ||
      content == null || content.trim().equals("")) {
    resp.setContentType("text/html;charset=UTF-8");
    PrintWriter out = resp.getWriter();
    out.println("<script>");
    out.println("alert('์ œ๋ชฉ๊ณผ ๋‚ด์šฉ์„ ๋ชจ๋‘ ์ž…๋ ฅํ•˜์„ธ์š”.'); history.back();");
    out.println("</script>");
    return;
  }

  // ํ†ต๊ณผ ์‹œ DB ์ €์žฅ ๋กœ์ง ์ˆ˜ํ–‰
  BoardDTO dto = new BoardDTO();
  dto.setTitle(title);
  dto.setContent(content);

  BoardDAO dao = new BoardDAO();
  dao.insert(dto);

  resp.sendRedirect("list");
}

โœ… 5. ๋ณ‘ํ–‰ ์ฒ˜๋ฆฌ ํ๋ฆ„๋„ ๐Ÿงญ

[์‚ฌ์šฉ์ž ์ž…๋ ฅ]
 โฌ‡ (onsubmit ์‹œ JS ๊ฒ€์‚ฌ)
[JavaScript ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ]
 โฌ‡ (ํ†ต๊ณผ ์‹œ ์„œ๋ฒ„ ์š”์ฒญ)
[Servlet doPost()]
 โฌ‡
[์„œ๋ฒ„ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์žฌํ™•์ธ]
 โฌ‡
[DB ์ €์žฅ or ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ]

โœ… 6. ์‹ค์ „ ์˜ˆ์ œ ํ๋ฆ„ ์š”์•ฝ

๋‹จ๊ณ„ ํŒŒ์ผ ์—ญํ• 
1 form.jsp JavaScript๋กœ ํ•„์ˆ˜๊ฐ’ ๊ฒ€์‚ฌ (๋นˆ์นธ ํ™•์ธ ๋“ฑ)
2 onsubmit="return validateForm()" false ๋ฐ˜ํ™˜ ์‹œ ์ „์†ก ์ค‘๋‹จ
3 SaveServlet.java ์ž…๋ ฅ๊ฐ’ null/๋นˆ์นธ ์žฌํ™•์ธ (๋ณด์•ˆ์ƒ ํ•„์ˆ˜)
4 ํ†ต๊ณผ ์‹œ โ†’ DTO ์ €์žฅ โ†’ DAO ํ˜ธ์ถœ โ†’ DB ์ €์žฅ ย 
5 ์‹คํŒจ ์‹œ โ†’ alert() ํ›„ history.back(); ์œผ๋กœ ํผ์œผ๋กœ ๋˜๋Œ๋ฆผ ย 

โœ… 7. ๊ธฐ์ˆ  ๋ฉด์ ‘ ๋Œ€๋น„ ํ•ต์‹ฌ ์š”์•ฝ ๐Ÿ’ฌ

์งˆ๋ฌธ ์š”์  ์ •๋ฆฌ
์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋Š” ์™œ ํ•ด์•ผ ํ•˜๋‚˜์š”? ์ž…๋ ฅ๊ฐ’ ์˜ค๋ฅ˜ ๋ฐฉ์ง€, ๋ณด์•ˆ ์œ ์ง€, ์‚ฌ์šฉ์ž ํŽธ์˜ ํ–ฅ์ƒ
JS๋งŒ ๊ฒ€์‚ฌํ•˜๋ฉด ์•ˆ ๋˜๋‚˜์š”? JS๋Š” ๊บผ์งˆ ์ˆ˜ ์žˆ์Œ โ†’ ๋ฐ˜๋“œ์‹œ ์„œ๋ฒ„์—์„œ๋„ ๊ฒ€์‚ฌ ํ•„์š”
Java์—์„œ null/๋นˆ ๋ฌธ์ž์—ด ์ฒดํฌ๋Š”? `== null
์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์‹คํŒจ ์‹œ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์€? alert() + history.back() ๋˜๋Š” ์˜ค๋ฅ˜ ํŽ˜์ด์ง€ ๋ฆฌ๋””๋ ‰์…˜

โœ… 8. ๋งˆ๋ฌด๋ฆฌ ์š”์•ฝ ๐Ÿง