** πŸ“Œλ°μ΄ν„° μ €μž₯ 흐름 κ΅¬ν˜„ (JSP β†’ Servlet β†’ DAO β†’ DB)**

μ‚¬μš©μž μž…λ ₯ 데이터λ₯Ό JSPμ—μ„œ λ°›μ•„ DB에 μ €μž₯ν•˜λŠ” 전체 싀무 흐름

ꡬ쑰도 + 단계별 μ—­ν•  + 전체 μ½”λ“œ + λ©΄μ ‘ λŒ€λΉ„κΉŒμ§€ μ™„μ „ 정리


🧩 λͺ©μ°¨

  1. 전체 흐름 κ°œμš”
  2. 단계별 μ—­ν•  (JSP β†’ Servlet β†’ DTO β†’ DAO β†’ DB)
  3. 전체 흐름 예제 μ½”λ“œ
  4. μ‹€μ œ μ‹€ν–‰ 흐름 μˆœμ„œ
  5. 자주 λ°œμƒν•˜λŠ” 였λ₯˜ & 해결법
  6. 기술 λ©΄μ ‘ λŒ€λΉ„ 핡심 μš”μ•½
  7. 마무리 μš”μ•½ + Notion μž‘μ„± 팁

βœ… 1. 전체 흐름 κ°œμš”

[1] form.jsp
 ⬇ μ‚¬μš©μž μž…λ ₯
[2] SaveServlet.java
 ⬇ νŒŒλΌλ―Έν„° β†’ DTO μ €μž₯
[3] BoardDTO.java
 ⬇ 데이터 μΊ‘μŠν™”
[4] BoardDAO.java
 ⬇ insert()둜 DB μ €μž₯
[5] MariaDB
 ⬆ 데이터 μ €μž₯ μ™„λ£Œ
[6] κ²°κ³Ό ν™”λ©΄ (λ¦¬λ””λ ‰νŠΈ or λ©”μ‹œμ§€ 좜λ ₯)

βœ… 2. 단계별 μ—­ν•  정리

단계 파일 μ—­ν• 
1 form.jsp μ‚¬μš©μžλ‘œλΆ€ν„° μž…λ ₯ λ°›κΈ° (View)
2 SaveServlet.java μž…λ ₯κ°’ 처리 + DTO 전달 (Controller)
3 BoardDTO.java μž…λ ₯ 데이터λ₯Ό λ‹΄λŠ” 클래슀 (Model)
4 BoardDAO.java DB μ €μž₯ λ©”μ„œλ“œ κ΅¬ν˜„ (Model)
5 MariaDB μ‹€μ œ 데이터 μ €μž₯μ†Œ (DB)

βœ… 3. 전체 흐름 예제 μ½”λ“œ 🎯


πŸ“„ [1] form.jsp (μ‚¬μš©μž μž…λ ₯ ν™”λ©΄)

<form action="save" method="post">
  제λͺ©: <input type="text" name="title"><br>
  λ‚΄μš©: <textarea name="content"></textarea><br>
  <input type="submit" value="μ €μž₯">
</form>

πŸ“„ [2] SaveServlet.java (μž…λ ₯ 처리 + DAO 호좜)

@WebServlet("/save")
public class SaveServlet extends HttpServlet {
  protected void doPost(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {

    req.setCharacterEncoding("UTF-8");

    // 1. μ‚¬μš©μž μž…λ ₯κ°’ λ°›κΈ°
    String title = req.getParameter("title");
    String content = req.getParameter("content");

    // 2. DTO에 μ €μž₯
    BoardDTO dto = new BoardDTO();
    dto.setTitle(title);
    dto.setContent(content);

    // 3. DAO에 μ „λ‹¬ν•˜μ—¬ DB μ €μž₯
    BoardDAO dao = new BoardDAO();
    dao.insert(dto);

    // 4. μ €μž₯ ν›„ λͺ©λ‘ νŽ˜μ΄μ§€λ‘œ 이동
    resp.sendRedirect("list.jsp");
  }
}

πŸ“„ [3] BoardDTO.java (데이터 객체)

public class BoardDTO {
  private String title;
  private String content;

  public String getTitle() {
    return title;
  }

  public void setTitle(String title) {
    this.title = title;
  }

  public String getContent() {
    return content;
  }

  public void setContent(String content) {
    this.content = content;
  }
}

πŸ“„ [4] BoardDAO.java (DB μ €μž₯ 처리)

public class BoardDAO {
  public void insert(BoardDTO dto) {
    try {
      Connection conn = DB.getConnection();
      String sql = "INSERT INTO board(title, content) VALUES (?, ?)";
      PreparedStatement ps = conn.prepareStatement(sql);
      ps.setString(1, dto.getTitle());
      ps.setString(2, dto.getContent());
      ps.executeUpdate();
      conn.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

πŸ“„ [5] DB.java (DB μ—°κ²° μ „μš© 클래슀)

public class DB {
  public static Connection getConnection() throws Exception {
    Class.forName("org.mariadb.jdbc.Driver");
    return DriverManager.getConnection(
      "jdbc:mariadb://localhost:3306/mydb", "myuser", "mypassword"
    );
  }
}

βœ… 4. μ‹€ν–‰ 흐름 μˆœμ„œ μš”μ•½

1. μ‚¬μš©μžκ°€ form.jspμ—μ„œ 제λͺ©/λ‚΄μš© μž…λ ₯ β†’ 전솑
2. SaveServletμ—μ„œ νŒŒλΌλ―Έν„°λ‘œ λ°›μ•„ DTO에 μ €μž₯
3. DAO의 insert(dto) 호좜 β†’ SQL μ‹€ν–‰
4. DB에 κ²Œμ‹œκΈ€ μ €μž₯
5. μ‚¬μš©μžλŠ” list.jsp λ˜λŠ” μ™„λ£Œ νŽ˜μ΄μ§€λ‘œ 이동

βœ… 5. 자주 λ°œμƒν•˜λŠ” 였λ₯˜ & 해결법 πŸ›‘οΈ

μ—λŸ¬ λ©”μ‹œμ§€ 원인 ν•΄κ²° 방법
NullPointerException request 값이 null name 속성 λˆ„λ½ or μ˜€νƒ€ 확인
SQLException DB μ—°κ²°/SQL 였λ₯˜ DB URL, 계정, SQL ꡬ문 확인
404 Not Found URL λ§€ν•‘ 였λ₯˜ @WebServlet("/save")와 form action 일치 확인
ν•œκΈ€ 깨짐 인코딩 μ„€μ • λˆ„λ½ request.setCharacterEncoding("UTF-8") ν•„μˆ˜!

βœ… 6. 기술 λ©΄μ ‘ λŒ€λΉ„ 핡심 μš”μ•½ πŸ’¬

질문 μš”μ  정리
JSP β†’ DB μ €μž₯ 흐름은? JSP(form) β†’ Servlet β†’ DTO β†’ DAO β†’ DB
DTO의 역할은? μž…λ ₯값을 객체둜 μ €μž₯ (데이터 μΊ‘μŠν™”)
DAO의 역할은? DB μ—°κ²° ν›„ SQL μ‹€ν–‰ (insert, select λ“±)
MVCμ—μ„œ Servlet은 μ–΄λ–€ μ—­ν• ? Controller (μš”μ²­ 처리, 흐름 μ œμ–΄)
SQL Injection λ°©μ§€λŠ”? PreparedStatement μ‚¬μš© (λ¬ΌμŒν‘œ 바인딩)

βœ… 7. 마무리 μš”μ•½ πŸ§