Spring/Spring Legacy

[JDBC]게시판(CRUD) 구현

Jenny_yoon 2023. 2. 25. 18:04
728x90
반응형

 

1. board.jsp 생성
데이터베이스 연결

 

<%@page import="java.util.HashMap"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.Map"%>
<%@page import="java.util.List"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.Connection"%>
<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
Connection conn = null; //Connection: 데이터베이스와 연결을 수립하는 데 사용
PreparedStatement pstmt = null; 
//PreparedStatement: 미리 컴파일된 SQL 문을 나타내며 실행할 때 매개변수를 전달함

String url = "jdbc:mariadb://wisejia.iptime.org:포트넘버/아이디";
String id = "id";
String pw = "pw";

Class.forName("org.mariadb.jdbc.Driver"); 
//Class.forName()을 사용하여 MariaDB JDBC 드라이버를 로드
//아래 객체를 생성하고 사용하기 전에 (Class.forName()로) 데이터베이스 드라이버를 로드해야함
conn = DriverManager.getConnection(url, id, pw); // 데이터베이스에 연결
pstmt = conn.prepareStatement("SELECT * FROM boardview LIMIT 0, 10");
ResultSet rs = pstmt.executeQuery(); //ResultSet: 명령에 대한 반환값
//즉, 주어진 코드에서는 MariaDB JDBC 드라이버를 로드하고, 
//데이터베이스 서버에 연결을 수립하고, 미리 컴파일된 쿼리문을 실행하고, ResultSet 객체를 가져와서 결과

List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();

while(rs.next()){ //next(); 뽑아줄 값이 존재하면 참, 아니면 거짓
//ResultSet을 반복하여 각 데이터 행을 검색
   Map<String, Object> e = new HashMap<String, Object>();
	//getXXX() 메소드를 사용하여 값을 가져와 각 데이터 행마다 채우기
   e.put("b_no", rs.getInt("b_no"));//저장할 키, 저장할 값
   e.put("b_title", rs.getString("b_title"));
   e.put("b_date", rs.getString("b_date"));
   e.put("member_name", rs.getString("member_name"));
   e.put("b_like", rs.getInt("b_like"));
   e.put("b_read", rs.getInt("b_read"));
   e.put("comment", rs.getInt("comment"));
   list.add(e);
}
%>

(위 같은 페이지 하단에 넣기)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>board</title>
</head>
<body>
<h1>board</h1>
<!-- 데이터베이스에 연결해서 해당 내용 가져오기 -->
<table border="1">
    <tr>
        <td>번호</td>
        <td>제목</td>
        <td>글쓴이</td>
        <td>날짜</td>
        <td>좋아요</td>
        <td>읽음</td>
    </tr>
    <% 
        for(int i = 0; i < list.size(); i++){
    %>
    <tr>
        <td><%=list.get(i).get("b_no") %></td>
        <td>
        <a href="./detail.jsp?bno=<%=list.get(i).get("b_no") %>">
        <%=list.get(i).get("b_title") %>
        </a>
        </td>
        <td><%=list.get(i).get("member_name") %></td>
        <td><%=list.get(i).get("b_date") %></td>
        <td><%=list.get(i).get("b_like") %></td>
        <td><%=list.get(i).get("b_read") %></td>
    </tr>
    <%
        }
    %>
</table>
<a href="./write.jsp">글쓰기</a>
	
</body>
</html>

 

 

DBConnection 생성
(중복코드 방지위해 DBConnection 따로 생성)

 

public class DBConnection {

    public Connection getConn() {
        Connection conn = null;
        try {
            Class.forName("org.mariadb.jdbc.Driver");
            String url = "jdbc:mariadb://wisejia.iptime.org:포트번호/아이디";
            String id = "id";
            String pw = "pw";
            conn = DriverManager.getConnection(url, id, pw);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
     }
}

 

 

BoardDTO 생성

 

//전송객체
public class BoardDTO {
	private int b_no, b_like, b_read, comment;
	private String b_title, b_content, member_name, b_date;

	public int getB_no() {
		return b_no;
	}

	public void setB_no(int b_no) {
		this.b_no = b_no;
	}

	public int getB_like() {
		return b_like;
	}

	public void setB_like(int b_like) {
		this.b_like = b_like;
	}

	public int getB_read() {
		return b_read;
	}

	public void setB_read(int b_read) {
		this.b_read = b_read;
	}

	public int getComment() {
		return comment;
	}

	public void setComment(int comment) {
		this.comment = comment;
	}

	public String getB_title() {
		return b_title;
	}

	public void setB_title(String b_title) {
		this.b_title = b_title;
	}

	public String getB_content() {
		return b_content;
	}

	public void setB_content(String b_content) {
		this.b_content = b_content;
	}

	public String getMember_name() {
		return member_name;
	}

	public void setMember_name(String member_name) {
		this.member_name = member_name;
	}

	public String getB_date() {
		return b_date;
	}

	public void setB_date(String b_date) {
		this.b_date = b_date;
	}

}

 

 

 

BoardDAO 생성

 

* write DAO (게시글 작성)

public class BoardDAO {
//데이터 베이스 접속 객체
	// 기능별로 구분
	public void write(BoardDTO board) { //BoardDTO에 있는값 뽑아서 쓰기
		// 데이터베이스 접속
		DBConnection dbConn = new DBConnection();
		Connection conn = dbConn.getConn(); //getConn():데이터베이스 연결에 사용할 Connection 객체 가져오기
		// 쿼리문 만들기
		String sql = "INSERT INTO board SET b_title=?, b_content=?, member_no=?";
        //?: SQL 쿼리의 값이 나중에 전달되는 것을 의미(SQL 쿼리 문자열에서 ?는 나중에 전달되는 값으로 대체됨)
		//SELECT만 resultset 필요
        
		// SQL인젝션 공격
		PreparedStatement pstmt = null;

		try {
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, board.getB_title());// 물음표 위치, 값
			pstmt.setString(2, board.getB_content());
			pstmt.setString(3, board.getMember_name());
			//실행 (3가지 방법)
			//pstmt.execute(); //boolean값 반환 (실행됬는지 안됬는지)
			//pstmt.executeQuery(); //SELECT에서 사용(결과값이 있을떄)
			int result = pstmt.executeUpdate(); //int반환(몇개가 영향 받았는지)
			System.out.println(result);

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			if (pstmt != null) {
				try {
					pstmt.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			if (conn != null) {
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
	}

- write.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>글쓰기</title>
</head>
<body>
	<h1>글쓰기</h1>
	<form action="./writeAction.jsp" method="post">
		<input type="text" name="title"><br>
		<textarea name="content"></textarea><br>
		<button type="submit">글쓰기</button>
	</form>
</body>
</html>

 

 

* delete DAO (게시글 삭제)

public void delete(int bno) {
    // DB
    DBConnection dbConn = new DBConnection();
    Connection conn = dbConn.getConn();
    // sql 생성
    String sql = "DELETE FROM board WHERE b_no=?";
    // pstmt 생성
    PreparedStatement pstmt = null;
	
    try {
        pstmt = conn.prepareStatement(sql);
        pstmt.setInt(1, bno);
        //실행(execute)
        pstmt.executeUpdate();

    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        if (pstmt != null) {
            try {
                pstmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

}

- delete.jsp

<%@page import="com.poseidon.dao.BoardDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
	//DAO만들어서 
	BoardDAO dao = new BoardDAO();
	//delete()메소드 호출해서
	//bno숫자 잡기
	int bno = Integer.parseInt(request.getParameter("bno"));
	dao.delete(bno);
	//삭제시키기

	 response.sendRedirect("./board.jsp");
%>

 

* detail DAO (게시글 보기)

public BoardDTO detail(int bno) {
    // DB
    DBConnection dbConn = new DBConnection();
    Connection conn = dbConn.getConn();
    // sql
    String sql = "SELECT * FROM boardview WHERE b_no=?";
    // pstmt
    PreparedStatement pstmt = null;
    // rs (execute 반환값이 있어서 rs)
    ResultSet rs = null;
    // DTO
    BoardDTO dto = new BoardDTO();

    try {
        pstmt = conn.prepareStatement(sql);
        pstmt.setInt(1, bno);
        // execute = 반환값이 있어서 rs
        rs = pstmt.executeQuery();

        if (rs.next()) {
            dto.setB_no(rs.getInt("b_no"));
            dto.setB_title(rs.getString("b_title"));
            dto.setB_content(rs.getString("b_content"));
            dto.setMember_name(rs.getString("member_name"));
            dto.setB_like(rs.getInt("b_like"));
            dto.setB_read(rs.getInt("b_read"));
        }

    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (pstmt != null) {
            try {
                pstmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    return dto;
}

- detail.jsp

<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String url = "jdbc:mariadb://wisejia.iptime.org:포트번호/id";
String id = "id";
String pw = "pw";
String sql = "SELECT * FROM boardview WHERE b_no="+ request.getParameter("bno");

Class.forName("org.mariadb.jdbc.Driver");
conn = DriverManager.getConnection(url, id, pw);
//Class.forName()을 사용하여 MariaDB JDBC 드라이버를 로드 
pstmt = conn.prepareStatement(sql);
//(conn로) sql 쿼리를 실행할 수 있는 PreparedStatement 객체를 생성

rs = pstmt.executeQuery();
//쿼리문 실행 //ResultSet: SELECT인 경우에만 필요
//즉 사용자가 요청한 게시글 번호(bno)를 기반으로 데이터베이스에 연결하고, 
//해당 게시글의 정보를 가져와서 화면에 표시하는 데 필요한 SQL 쿼리문을 실행

Map<String, Object> detail = new HashMap<String, Object>();
if(rs.next()){
	detail.put("b_no", rs.getInt("b_no"));
	detail.put("b_title", rs.getString("b_title"));
	detail.put("b_content", rs.getString("b_content"));
	detail.put("b_date", rs.getString("b_date"));
	detail.put("member_name", rs.getString("member_name"));
	detail.put("b_like", rs.getInt("b_like"));
	detail.put("b_read", rs.getInt("b_read"));
	detail.put("comment", rs.getInt("comment"));
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>톺아보기</title>
</head>
<body>
	번호 : <%=detail.get("b_no") %><br>
	제목 : <%=detail.get("b_title") %>
	<a href="./delete.jsp?bno=<%=detail.get("b_no") %>">[삭제]</a>
	<a href="./update?bno=<%=detail.get("b_no") %>">[수정]</a><br>
	날짜 : <%=detail.get("b_date") %><br>
	읽음 : <%=detail.get("b_like") %><br>
	글쓴이 : <%=detail.get("member_name") %><br>
	내용 : <%=detail.get("b_content") %><br>
	<button onclick="location.href='./board.jsp'">보드로</button>
</body>
</html>

 

 

* update DAO (게시글 수정)

public void update(BoardDTO dto) {
    //db
    DBConnection DBConn = new DBConnection();
    Connection conn = DBConn.getConn();
    //sql
    String sql = "UPDATE board SET b_title=?, b_content=? WHERE b_no=?";
    PreparedStatement pstmt = null;

    try {
        pstmt = conn.prepareStatement(sql);
        pstmt.setString(1, dto.getB_title());
        pstmt.setString(2, dto.getB_content());
        pstmt.setInt(3, dto.getB_no());

        //execute
        pstmt.execute();

    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        if(pstmt != null) {try {pstmt.close();} catch (SQLException e) {e.printStackTrace();}}
        if(conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}
    }
}

- update.jsp

<%@page import="com.poseidon.dto.BoardDTO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
	//디스패쳐에서 가져오기
	BoardDTO dto = (BoardDTO)request.getAttribute("dto");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>수정하기</title>
</head>
<body>
<div>
    <form action="./update" method="post">
        <input type="hidden" name="bno" value="<%=dto.getB_no() %>">
        <input type="text" name="title" value="<%=dto.getB_title() %>"><br>
        <textarea name="content"><%=dto.getB_content() %></textarea><br>
        <button type="submit">수정하기</button>
    </form>
</div>
</body>
</html>

 

 

서블릿 생성(서블릿 방식으로 하는 경우)
package com.poseidon.web;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;

import javax.security.auth.message.callback.PrivateKeyCallback.Request;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.poseidon.dao.BoardDAO;
import com.poseidon.db.DBConnection;
import com.poseidon.dto.BoardDTO;

@WebServlet("/update")
public class Update extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public Update() {
        super();
    }

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //GET
    System.out.println("get방식으로 왔습니다");
    //DAO접속
    BoardDAO dao = new BoardDAO();

    //detail호출
    int bno = Integer.parseInt(request.getParameter("bno"));
    BoardDTO dto = dao.detail(bno);
    //값 jsp로 전달
    RequestDispatcher rd = request.getRequestDispatcher("./update.jsp");
    request.setAttribute("dto", dto);//데이터베이스에서 가져온 dto붙이기
    //setAttribute는 AddObject()개념과 똑같음
    rd.forward(request, response);//값 넘기기
	}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //POST
    System.out.println("post방식으로 왔습니다");
    //수정하고
    BoardDTO dto = new BoardDTO();
    dto.setB_no(Integer.parseInt(request.getParameter("bno")));
    dto.setB_title(request.getParameter("title"));
    dto.setB_content(request.getParameter("content"));

    //DAO객체 생성해서 update(dto) 만들어주기
    BoardDAO dao = new BoardDAO();
    dao.update(dto);

    //페이지 이동
    //response.sendRedirect("./detail.jsp?bno="+dto.getB_no());
    //서블릿이 자체적으로 화면을 구성하고 싶을땐 아래처럼 해주세요. 
    response.setCharacterEncoding("UTF-8");
    response.setContentType("text/html;charset=utf-8");
    PrintWriter pw = response.getWriter();
    pw.println("<html>");
    pw.println("<head>");
    pw.println("<title>수정이 완료되었습니다</title>");
    pw.println("</head>");
    pw.println("<body>");
    pw.println("<h1>수정이 완료되었습니다 아래 버튼을 눌러주세요</h1>");
    pw.println("<a href=\"./detail.jsp?bno="+dto.getB_no()+"\">");
    //pw.println("<a href='./detail.jsp?bno="+dto.getB_no()+"'>");
    pw.println("상세보기 화면으로 이동하기</a>");
    pw.println("</body>");
    pw.println("</html>");
    pw.close();
	}
}
728x90
반응형