KH/JDBC

JDBC를 이용하여 게시판 만들기

오늘의 진 2022. 10. 17. 11:00

[개요 - 사용한 코드의 설계도 ]

editBoard.jsp  boardform.js  processboard.jsp 
기본 작성 화면 구성 

제목, 내용, 이름등을 적을 공간과 버튼
등을 table로 구성 

id값, menu값은 hidden으로 전달 

boardform.js 연결 - 알람 받음
proessboard.jsp 연결 


editBoard.jsp에 연결된 scirpt 이다. 
입력된 값을 전달 받아서 그에 따른 
alter() 수행 
boardform.sumit을 통해 editBoard로 
전송을 수행 >> edicBoard의 form에서 받아서processbboard로 이동 
editBoard로 부터 전달된 menu에 따라 
BoardDBCP.java로 전달된 파라미터를 전달하여 데이터베이스 작업을 명령 
하고 listBoard로 이동 
listBoard.jsp BoardDBCP.java BoardEntity .java
게시판을 작성하고 이동하는
목록창 구현

BoardDBCP를 이용해 테이블의 모든 내용을 get함

get한 내용을 BoardEntity에 담아서for문을 이용하여 목록창 형태로 출력한다.



날짜는 simpleDateFormat을 통해 현재시간 받아오기 

id값에 링크를 달아 그 아이디에 대한
editBoard.jsp로 이동하도록 함

DB로의 연결을 위한 객체를 생성 
쿼리문을 실행하는 공간

생성자를 통해 드라이버를 로드함

getBoardList() : 테이블 내의 모든 데이터를  BoardEntity 인스턴스를 통해서
list에 담는다. 

getSearchList (): name값에 대한 데이터 를 list에 추가 하고 return
 
getBoard : 전달 받은 id값에 대한 데이터를 BoardEntity인스턴스에 담아서 set한다

insertDB() :DB에 값을 저장한다. 

updateDB() : DB의 값을 변경

deletDB() : DB의 값을  전달받은 id에 따라 삭제

isPasswd() : 전달받은 passwd와 DB에 저장된 passwd가 같은지 확인 
getter, setter 가 있는공간 

폼에 입력한 정보를 DB로 옮기거나 DB의 내용을 폼으로 꺼내올때 그것을 옮길 바구니로써 사용하는 공간을 구현함 
BoardEntity의 인스턴스를 생성하여 
데이터를 옮긴다. 

 

 

editBoard.jsp 

 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시판 기본 예제 : 게시폼 작성</title>
</head>

<!-- 파일 boardform.js: 폼의 각 입력값이 있는지를 검토하는 함수 구현 -->
<script src="boardform.js"></script>
<!-- boardform.js를 가져다 쓰겠다는 말  -->

<body>

	<%@ page import="univ.*"%>

	<%
	String name = "";
	String email = "";
	String title = "";
	String content = "";
	String headline = "등록"; // 시작하는 값은 등록 

	String id = request.getParameter("id");
	// listBoard.jsp로 부터 전달받는 값 id 
	//새 문서 쓰기에서는 아이디값이 전달되지 않음으로 null 
	if (id != null) {
		//등록이 아닌 경우, 출력을 위해 선택한 게시의 각 필드 내용을 저장 

		int idnum = Integer.parseInt(id);
		BoardDBCP brddb = new BoardDBCP();
		BoardEntity brd = brddb.getBoard(idnum);
		name = brd.getName();
		email = brd.getEmail();
		title = brd.getTitle();
		content = brd.getContent();
		headline = "수정 삭제"; // 수정할떄는 게시판 헤드라인 변경 

	}
	;
	%>


	<h2>
		게시판
		<%=headline%>
		프로그램
	</h2>
	<hr>

	<form action="processboard.jsp" name="boardform" method="post">

		<!-- menu : 등록, 수정 또는 삭제 구분을 위한 매개 변수로 이용 -->
		<input type="hidden" name="menu" value="insert">

		<!-- 수정 또는 삭제를 위한 게시 id를 hidden으로 전송 -->
		<input type="hidden" name="id" value=<%=id%>>

		<table>
			<!-- 5행2열  -->

			<tr>
				<td align="center">
					<!-- 안에 들어오는 table을 중앙에 위치시키기 위해 -->


					<table>
						<!-- 첫번째 행 전체 안에 작성, 2행4열 테이블 -->
						<tr>
							<td colspan="2">
								<table>
									<tr>
										<td>이름 :</td>
										<td width="50"><input type="text" name="name" value="<%=name%>" size="30" maxlength="20"></td>

										<td>전자 메일 :</td>
										<td width="50"><input type="text" name="email" size="30" value="<%=email%>" maxlength="30"></td>
									<tr>
										<td>제목 :</td>
										<td colspan="3"><input type="text" name="title" size="80" value="<%=title%>" maxlength="100"></td>
									</tr>
								</table>
							</td>
						</tr>


						<tr>
							<td colspan="2">
								<!-- 두번째행 --> <textarea name=content rows=10 cols=90> <%=content%> </textarea>
							</td>
						</tr>

						<tr>
							<!-- 세번째 행 -->
							<td colspan="2">비밀번호 : <input type="password" name="passwd" size="20" maxlength="15"> <font color="red">현재 게시판 수정 또는 삭제하려면 이미 등록한 비밀번호가 필요합니다.</font>
							</td>
						</tr>
						<tr>
							<!-- 네번째 행 -->
							<td colspan="2" height="5">
								<hr size="2">
							</td>

						</tr>
						<tr>
							<!-- 다섯번째행  -->
							<td colspan="2">
								<%
								if (id == null) {
								%>
								 <!-- 버튼을 누르면 boardform.js의 함수를 실행하여 processboard.jsp로 이동 -->
								  <input type="button" value="등록" onclick="insertcheck()"> <%
                                  } else {
                               %> <!-- 버튼을 누르면 boardform.js의 각 함수를 힐생하여 processbaord.jsp로 이동 --> 
                                  <input type="button" value="수정 완료" onclick="updatecheck()"> 
                                  <input type="button" value="삭제" onclick="deletecheck()"> <%
                                          }
                                %> <!--  목록보기 버튼을 listboard.jsp로 이동 -->
                                  <input type="button" value="목록보기" onclick="location.href='listboard.jsp'">
							</td>
						</tr>
					</table>
				</td>
			</tr>
		</table>


	</form>






</body>
</html>

각종 알람을 띄우고 menu의 값을 변경할 boardform.js 

function deletecheck() {
	if (document.boardform.passwd.value == "") {
		alert("암호를 입력해 주세요!!");
		document.boardform.passwd.focus();
		return;
	}
	ok = confirm("삭제하시겠습니까");

	if (ok) {
		document.boardform.menu.value = "delete";
		document.boardform.submit();
	} else {
		return;
	}

}

function insertcheck() {

	if (document.boardform.name.value == "") {
		alert("이름을 입력해 주세요 !!");
		document.boardform.name.focus();
		return;
	}
	if (document.boardform.passwd.value == "") {
		alert("암호를 입력해 주세요 !!");
		document.boardform.passwd.focus();
		return;
	}
	document.boardform.menu.value = "insert";
	document.boardform.submit(); // processboard.jsp로 전송됨 (넘어감)

}


function updatecheck() {

	if (document.boardform.name.value == "") {
		alert("이름을 입력해 주세요");
		document.boardform.name.focus();
		return;
	}
	if (document.boardform.passwd.value == "") {
		alert("암호를 입력해주세요");
		document.boardform.passwd.focus();
		return;
	}
	document.boardform.menu.value = "update";
	document.boardform.submit();

}

 

boardform.js로 부터 editboard로 submit >> processboard로 이동한다. 

processboard.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>
   <!-- 게시글 등록, 수정, 삭제를 위한 자바빈즈 선언 -->
   <jsp:useBean id="brd" class="univ.BoardEntity" scope="page"/> <!-- 한사람의 입력정보를 전달하기 위한 객체 -->
   <jsp:useBean id="brddb" class="univ.BoardDBCP" scope="page"/>
   
   <%
   // 한글 처리를 위해 문자인코딩 지정
   request.setCharacterEncoding("utf-8");
   //등록(insert) 수정(update) 삭제(delete) 중 하나를 저장
   String menu = request.getParameter("menu");
   // 등록 또는 수정 처리 모듈
   if(menu.equals("delete") || menu.equals("update")){
      String id = request.getParameter("id");
      String passwd = request.getParameter("passwd");
      int idnum = Integer.parseInt(id);
      // 데이터베이스 자바빈즈에 구현된 메소드 isPasswd()로 id와 암호가 일치하는지 검사
      if(!brddb.isPasswd(idnum, passwd)){
   %>
         <!-- 암호가 틀리면 이전 화면으로 이동 -->
         <script>alert("비밀번호가 다릅니다."); history.go(-1);</script>
         
         <%
      } else{
         if(menu.equals("delete")){
            // 삭제를 위한 데이터베이스 자바빈즈에 구현된 메소드 deleteDB() 실행
            brddb.deleteDB(idnum);
         }else if(menu.equals("update")){
         %>
         
            <!-- 수정 시 BoardEntity에 저장해야 하는 필드 id -->
            <jsp:setProperty name="brd" property="id"/>
            <jsp:setProperty name="brd" property="name"/>
            <jsp:setProperty name="brd" property="title"/>
            <jsp:setProperty name="brd" property="email"/>
            <jsp:setProperty name="brd" property="content"/>
            
            <%
            // 수정을 위해 데이터베이스 자바빈즈에 구현된 메소드 updateDB() 실행
            brddb.updateDB(brd);
            
         }
         // 기능 수행 후 다시 게시 목록 보기로 이동
         response.sendRedirect("listboard.jsp");
      }
   }else if(menu.equals("insert")){
            %>
      
      <!-- 등록 시 BoardEntity에 저장해야 하는 필드 passwd -->
      <!-- 입력 받은 값들을 집어넣음 -->
      <jsp:setProperty name="brd" property="name"/>
      <jsp:setProperty name="brd" property="title"/>
      <jsp:setProperty name="brd" property="email"/>
      <jsp:setProperty name="brd" property="content"/>
      <jsp:setProperty name="brd" property="passwd"/>
      
      
      <%
      // 등록을 위해 데이터베이스 자바빈즈에 구현된 메소드 insertDB() 실행
      brddb.insertDB(brd);
      // 기능 수행 후 다시 게시 목록 보기로 이동
      response.sendRedirect("listboard.jsp");
   }
      %>

</body>
</html>

 

process에서 BoardEntity의 인스턴스에 값을 저장하여 BoardDBCP의 인스턴스를 호출하여 명령에 맞는 쿼리문을 실행한다.(쿼리문 실행을 통하여 오라클에서 명령을 수행 )

그리고 response.sendRedirect를 통해 listboard.jsp로 이동한다. 

 

listboard.jsp 

<%@page import="java.text.SimpleDateFormat"%>
<%@page import="univ.BoardEntity"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시판 기본 예제 : 게시 목록 표시</title>
</head>
<body>
<h2>게시판 목록 표시 프로그램</h2>
<hr>
<jsp:useBean id="brddb" class="univ.BoardDBCP" scope="page"/>

<%
//게시목록을 위한 배열 리스트를 자바빈즈를 이용하여 확보 
ArrayList<BoardEntity> list = brddb.getBoardList();
int count = list.size();
int row =0;
if(count > 0){

%>


<table>
<tr>
<th><font color="blue"><b>번호</b></font></th>
<th><font color="blue"><b>제목</b></font></th>
<th><font color="blue"><b>작성자</b></font></th>
<th><font color="blue"><b>작성일</b></font></th>
<th><font color="blue"><b>전자메일</b></font></th>
</tr>
<%
//게시 등록일을 2022-10-14 10:33:21 형태로 출력하기
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
for(BoardEntity brd :list){
	//홀짝으로 다르게 색상지정
	String color ="papayawhip";
	if(++row % 2 ==0)color ="white";

%>

<tr bgcolor="<%=color%>" onmouseover="this.style.backgroundColor='SkyBlue'" 
onmouseout="this.style.backgroundColor='<%=color %>'">
<!-- 수정과 삭제를 위한 링크로 id를 전송 -->
<td align="center"> <a href="editBoard.jsp?id=<%= brd.getId()%>"> <%=brd.getId() %> </a></td>
<!--id값을 가지고 aditBoard.jsp로 이동하라  -->
<td align="left"> <%=brd.getTitle() %></td>
<td align="center"> <%= brd.getName()%></td>
<td align="center"> <%=df.format(brd.getRegdate()) %></td>
<td align="center"> <%=brd.getEmail() %></td>
</tr>
<%
}
%>

</table>
<%
}
%>


<hr width="90%">
<p>조회된 게시판 목록 수가 <%=count %>개 입니다. </p>
<hr>
<form name="form" method="post"   action="editBoard.jsp">
<input type="submit" value="게시물 등록">
</form>





</body>
</html>

테이블을 구성할때 brddb.getBoardList()를 사용한다. 

즉 데이터 베이스에서 테이블 내에 있는 모든 내용을 한 행씩 BoardEntity의 인스턴스로 만들어서 담아둔 list를 만들고

이 리스트로 부터 한행씩 정보를 꺼내서 테이블을 구성한다. 

이때 id값에 링크를 달아주는데 eidtBoard.jsp?id= 으로 해서 id값이 해당 값인 editboard로 이동한다.

 

 

BoardDBCP.java

package univ;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.naming.InitialContext;
import javax.sql.DataSource;

//DBCP를 이용한 테이블 board_1 처리 데이터베이스 연동 자바빈즈 프로그램
public class BoardDBCP {
   
   // 데이터베이스 연결관련 변수 선언
   private Connection con = null;
   private PreparedStatement pstmt = null;
   private DataSource ds = null;
   
   // JDBC 드라이버 로드 메소드
   public BoardDBCP() { // 생성자
      try {
         InitialContext ctx = new InitialContext();
         ds = (DataSource)ctx.lookup("java:comp/env/jdbc/OracleDB");
      }catch(Exception e) {
         e.printStackTrace();
      }
   }
   
   // 데이터베이스 연결 메소드
   public void connect() {
      try {
         con = ds.getConnection();
      }catch(Exception e) {
         e.printStackTrace();
      }
   }
   
   // 데이터베이스 연결 해제 메소드
   public void disconnect() {
      if(pstmt != null) {
         try {
            pstmt.close();
         }catch(SQLException e) {
            e.printStackTrace();
         }
      }
      
      if(con != null) {
         try {
            con.close();
         }catch(SQLException e) {
            e.printStackTrace();
         }
      }
   }
   
   // 게시판의 모든 레코드를 반환 메소드
   public ArrayList<BoardEntity> getBoardList(){
      connect();
      ArrayList<BoardEntity> list = new ArrayList<BoardEntity>();
      
      String SQL = "select * from board_1 order by id desc";
      try {
         pstmt = con.prepareStatement(SQL);
         ResultSet rs = pstmt.executeQuery();
         
         while(rs.next()) {
            BoardEntity brd = new BoardEntity();
            brd.setId(rs.getInt("id"));
            brd.setName(rs.getString("name"));
            brd.setPasswd(rs.getString("passwd"));
            brd.setTitle(rs.getString("title"));
            brd.setEmail(rs.getString("email"));
            brd.setRegdate(rs.getTimestamp("regdate"));
            brd.setContent(rs.getString("content"));
            
            // 리스트에 추가
            list.add(brd);
         }
         rs.close();
      }catch(SQLException e) {
         e.printStackTrace();
      }finally {
         disconnect();
      }
      
      return list;
   }
   
   // 게시판의 레코드를 반환 메소드
   public ArrayList<BoardEntity> getSearchList(String name){
      connect();
      ArrayList<BoardEntity> list = new ArrayList<BoardEntity>();
      
      String SQL = "select * from board_1 where name = ?";
      try {
         pstmt = con.prepareStatement(SQL);
         pstmt.setString(1, name);
         ResultSet rs = pstmt.executeQuery();
         
         while(rs.next()) {
            BoardEntity brd = new BoardEntity();
            brd.setId(rs.getInt("id"));
            brd.setName(rs.getString("name"));
            brd.setPasswd(rs.getString("passwd"));
            brd.setTitle(rs.getString("title"));
            brd.setEmail(rs.getString("email"));
            brd.setRegdate(rs.getTimestamp("regdate"));
            brd.setContent(rs.getString("content"));
            
            // 리스트에 추가
            list.add(brd);
         }
         rs.close();
         
      }catch(SQLException e) {
         e.printStackTrace();
      }finally {
         disconnect();
      }
      
      return list;
   }
   
   // 주 키 id의 레코드를 반환하는 메소드
   public BoardEntity getBoard(int id) {
      connect();
      String SQL = "select * from board_1 where id = ?";
      
      BoardEntity brd = new BoardEntity();
      try {
         pstmt = con.prepareStatement(SQL);
         pstmt.setInt(1, id);
         ResultSet rs = pstmt.executeQuery();
         
         rs.next();
         //한 id에 대해 저장된 내용을  set하는 것이므로 rs.next로 한 행만 출력
         
         brd.setId(rs.getInt("id"));
         brd.setName(rs.getString("name"));
         brd.setPasswd(rs.getString("passwd"));
         brd.setTitle(rs.getString("title"));
         brd.setEmail(rs.getString("email"));
         brd.setRegdate(rs.getTimestamp("regdate"));
         brd.setContent(rs.getString("content"));
            
         rs.close();
         
      }catch(SQLException e) {
         e.printStackTrace();
      }finally {
         disconnect();
      }
      
      return brd;
   }
   
   // 게시글 등록 메소드
   public boolean insertDB(BoardEntity board) {
      boolean success = false;
      connect();
      String SQL = "insert into board_1 values(board_1_seq.nextval, ?, ?, ?, ?, sysdate, ?)";
      
      try {
         pstmt = con.prepareStatement(SQL);
         pstmt.setString(1, board.getName());
         pstmt.setString(2, board.getPasswd());
         pstmt.setString(3, board.getTitle());
         pstmt.setString(4, board.getEmail());
         pstmt.setString(5, board.getContent());
         pstmt.executeUpdate();
         success = true;
      }catch(SQLException e) {
         e.printStackTrace();
         return success;
      }finally {
         disconnect();
      }
      
      return success;
   }
   
   // 데이터 갱신을 위한 메소드
   public boolean updateDB(BoardEntity board) {
      boolean success = false;
      String SQL = "update board_1 set name=?, title=?, email=?, content=? where id=?";
      // String SQL = "update board_1 set name=?, title=?, email=?, content=? where title=?";
      
      try {
         pstmt = con.prepareStatement(SQL);
         pstmt.setString(1, board.getName());
         pstmt.setString(2, board.getTitle());
         pstmt.setString(3, board.getEmail());
         pstmt.setString(4, board.getContent());
         pstmt.setInt(5, board.getId());
         
         int rowUdt = pstmt.executeUpdate();
         // System.out.println(rowUdt);
         if(rowUdt == 1) success = true;
      }catch(SQLException e) {
         e.printStackTrace();
         return success;
      }finally {
         disconnect();
      }
      
      return success;
   }
   
   // 게시물 삭제를 위한 메소드
   public boolean deleteDB(int id) {
      boolean success = false;
      connect();
      String SQL = "delete from board_1 where id=?";
      
      try {
         pstmt = con.prepareStatement(SQL);
         // 인자로 받은 주 키인 id 값을 이용해 삭제
         pstmt.setInt(1, id);
         pstmt.executeUpdate();
         success = true;
      }catch(SQLException e) {
         e.printStackTrace();
         return success;
      }finally {
         disconnect();
      }
      
      return success;
   }
   
   // 데이터베이스에서 인자인 id와 passwd가 일치하는지 검사하는 메소드
   public boolean isPasswd(int id, String passwd) {
      boolean success = false;
      connect();
      String SQL = "select passwd from board_1 where id=?";
      
      try {
         pstmt = con.prepareStatement(SQL);
         pstmt.setInt(1, id);
         ResultSet rs = pstmt.executeQuery();
         
         rs.next();
         String orgPasswd = rs.getString(1);
         if(passwd.equals(orgPasswd)) success = true;
         System.out.println(success);
         rs.close();
      }catch(SQLException e) {
         e.printStackTrace();
         return success;
      }finally {
         disconnect();
      }
      
      return success;
   }
   
         
}

쿼리문을 만들고 DB와 연결하여 쿼리문을 실행하는 역할을한다. 

또한 실행된 쿼리문을 BoardEntity에 담아서 return하는 역할을 한다. 

 

 

 

 

'KH > JDBC' 카테고리의 다른 글

JQuery_selector  (0) 2022.10.20
jQuery _01  (0) 2022.10.19
ResultSet과 commit, rollback의 문제  (0) 2022.10.19
JSTL_XML, SQL, 파일 업로드 기능 구현하기  (0) 2022.10.18
EL(Expression Language) 연산자  (0) 2022.10.17