JDBC CRD (Board)

Let's Just Go·2022년 5월 25일
0

JDBC

목록 보기
4/5

JDBC

CRD (Create, Read, Delete)

  • Web Browser에서 사용자에게 값을 입력 받아서 입력 값을 Database에 저장하거나 Database에서 값을 받아와 사용자에게 보여주는 과정 진행

interface

  • interface
    • 클래스를 만들기 위한 틀

    • 여러 클래스에서 동일한 동작을 할 수 있게 만드는 틀

    • abstract method만 있으므로 interface 혼자서 뭘 할 수 없음(Method Body가 없기 때문)

      package kr.co.jsp.board.model;
      
      import java.util.List;
      
      public interface IBoardDAO {
      	
      	/*
      	 interface 
      	 - 클래스를 만들기 위한 틀 
      	 - interface 혼자서 어떤 것을 할 수 없음(추상 메서드만 있으므로)
      	 */
      	
      	// 게시글 등록 
      	boolean insert(BoardVO vo);
      	// 모든 게시물의 정보가 들어있는 객체가 들어감
      	// execute~~는 true,false로 반환되므로 리턴 타입도 지정
      	
      	// 게시글 전체 조회 
      	List<BoardVO> selectAll();
      	
      	// 게시글 상세 조회 
      	BoardVO selectOne(int num);
      	// 글 제목이 ?로 되기 때문에 매개변수로 넣음
      	
      	// 게시글 수정 
      	boolean update(BoardVO board);
      	// 글 제목, 글 내용, 글 번호가 ?로 되는데 그냥 BoardVO 객체를 통해서 넣을 수 있으므로 그냥 BoardVO객체 사용
      	// execute~~는 true,false로 반환되므로 리턴 타입도 지정
      
      	// 게시글 삭제
      	boolean delete(int num);
      	// 글 번호가 ?로 되기 때문에 매개변수로 넣음
      }

Util

  • Util
    • 매번 finally 뒤에 연결을 끊어주는 것이 효율성이 떨어져 클래스를 만들어 사용

      package kr.co.jsp.util;
      
      import java.sql.Connection;
      import java.sql.PreparedStatement;
      import java.sql.ResultSet;
      import java.sql.SQLException;
      
      public class JdbdUtil {
      	
      	public static void close(Connection conn, PreparedStatement pstmt) {
      		try {
      			if(pstmt!=null) pstmt.close();
      			if(conn != null) conn.close();
      		}
      		catch (SQLException e) {
      			System.out.println("close 과정에서 에러 발생!");
      		}
      	}
      	
      	public static void close(Connection conn, PreparedStatement pstmt, ResultSet rs) {
      		try {
      			if(rs != null) rs.close();
      			if(pstmt != null) pstmt.close();
      			if(conn != null) conn.close();
      		}
      		catch (SQLException e) {
      			System.out.println("close 과정에서 에러 발생!");
      		}
      	}
      }

Insert

  • INSERT
    • DAO에 insert 로직을 구현

    • DAO의 insert는 true, false를 반환하므로 jsp에서 true or false로 조건을 걸어 성공적으로 insert 성공 유무 확인

    • BoardDAO

      package kr.co.jsp.board.model;
      
      import java.sql.Connection;
      import java.sql.DriverManager;
      import java.sql.PreparedStatement;
      import java.sql.ResultSet;
      import java.sql.SQLException;
      import java.util.ArrayList;
      import java.util.List;
      
      import kr.co.jsp.util.JdbdUtil;
      
      public class BoardDAO implements IBoardDAO {
      	
      	// 싱글톤 디자인 패턴 구축 
      	
      	// 외부에서 객체 생성을 하지 못하고 접근하지 못하도록 하기 위해 private 작성
      	private BoardDAO() {
      		try {
      			Class.forName("oracle.jdbc.driver.OracleDriver");
      		} catch (Exception e) {
      			e.printStackTrace();
      		}
      	}
      	
      	private static BoardDAO dao = new BoardDAO();
      	
      	// BoardDAO에 접근하기 위해서는 getInstance()메소드를 통해서만 접근
      	public static BoardDAO getInstance() {
      		return dao;
      	}
      	
      	
      	//////////////////////////////////////////////
      	
      	Connection conn = null;
      	PreparedStatement pstmt = null;
      	ResultSet rs = null;
      	
      	private Connection getConnection() throws Exception {
      		String url = "jdbc:oracle:thin:@localhost:1521:xe";
      		String uid = "jsp";
      		String upw = "jsp";
      		
      		return DriverManager.getConnection(url, uid, upw);
      	} // DB를 연동할 수 있는 메소드를 생성
      
      	@Override
      	public boolean insert(BoardVO vo) {
      		boolean flag = false;
      		String sql = "INSERT INTO board VALUES(bid_seq.NEXTVAL, ?, ?, ?, sysdate)";
      		// sysdate는 굳이 넣지 않아도 상관없음 그 대신 table뒤에 컬럼명을 각각 지정해줘야함
      		
      		try {
      			conn = getConnection();
      			// DB접속
      			pstmt = conn.prepareStatement(sql);
      			pstmt.setString(1, vo.getWriter());
      			pstmt.setString(2, vo.getTitle());
      			pstmt.setString(3, vo.getContent());
      			// 값 넣어주기 
      			
      			int rn = pstmt.executeUpdate();
      			if (rn == 1) {
      				flag = true;
      			}
      		}catch (Exception e) {
      			// TODO Auto-generated catch block
      			e.printStackTrace();
      		} finally {
      			JdbdUtil.close(conn, pstmt);
      		}
      		
      		return flag;
      	}

    • write.jsp

    • 사용자에게 값을 입력 받는 곳

      <%@ page language="java" contentType="text/html; charset=UTF-8"
          pageEncoding="UTF-8"%>
      <!DOCTYPE html>
      <html>
      <head>
      <meta charset="UTF-8">
      <title>Insert title here</title>
      </head>
      <body>
      
      	<h2>게시글 등록</h2>
      	<form action="write_con.jsp" method="post">
      		<p>
      			# 작성자 : <input type="text" name="writer"><br>
      			# 제목 : <input type = "text" name = "title"><br>
      			# 글내용 : <br>
      			<textarea rows="3" name = "content"></textarea><br>
      			<input type = "submit" value = "등록">
      			<!-- submit 등록을 클릭하게 되면 post방식으로  write_con.jsp로 값이 이동 -->
      		</p>
      	</form>
      </body>
      </html>
    • write_con.jsp

    • 사용자에게 입력 받은 값을 DAO와 연동

      <%@page import="kr.co.jsp.board.model.BoardDAO"%>
      <%@page import="kr.co.jsp.board.model.BoardVO"%>
      <%@ page language="java" contentType="text/html; charset=UTF-8"
      	pageEncoding="UTF-8"%>
      
      <%
          /*
          1. 사용자의 입력값을 가져오세요. 그리고 객체로 포장하세요.
          2. DAO클래스의 주소값을 받아 DB에 내용을 삽입하는 메서드를 호출하세요.
          (board_id -> 시퀀스 객체로 삽입, 날짜는 넣어줄 필요가 없다.)
          3. 글 등록 성공 시 list.jsp로 리다이렉팅,
          4. 글 등록 실패 시 write.jsp로 리다이렉팅 해 주세요.
          */
          
          request.setCharacterEncoding("utf-8");
      	// post방식이므로 인코딩설정 
      	
      	String name = request.getParameter("writer");
      	String title = request.getParameter("title");
      	String content = request.getParameter("content");
      	// write.jsp에서 준 값을 get 
      	
      	BoardVO board = new BoardVO();
      	board.setWriter(name);
      	board.setTitle(title);
      	board.setContent(content);
      	// 개별 값을 넣어줌
      	
      	BoardDAO DAO = BoardDAO.getInstance();
      	// 주소값을 받아옴
      	
      	boolean flag = DAO.insert(board);
      	
      	if (flag){
      		response.sendRedirect("list.jsp");
      		System.out.println("등록완료");
      		// flag가 true이면 등록완료이므로 해당 jsp파일로 이동 
      	}
      	else {
      		response.sendRedirect("write.jsp");
      		// flag가 false이면 등록완료가 안되었으므로 다시 작성하도록 하기 
      	}
          %>

SELECT

  • SELECT ALL
    • 전체 데이터를 조회하는 기능

    • BoardDAO

      @Override
      	public List<BoardVO> selectAll() {
      		List<BoardVO> boardlist = new ArrayList<>();
      		String sql = "SELECT * FROM board ORDER BY BOARD_ID ASC";
      		try {
      			conn = getConnection();
      			pstmt = conn.prepareStatement(sql);
      			rs = pstmt.executeQuery();
      			// 데이터베이스 연결 및 쿼리 실행
      			while (rs.next()) {
      				BoardVO vo = new BoardVO(rs.getInt("Board_ID"), rs.getString("WRITER"), rs.getString("TITLE"),
      						rs.getString("CONTENT"), rs.getTimestamp("REG_DATE"));
      				// 객체를 생성해서 값을 넣어줌 
      				boardlist.add(vo);
      				// 객체를 객체 저장소인 boadlist에 넣어줌 
      			}
      		} catch (Exception e) {
      			e.printStackTrace();
      		} finally {
      			JdbdUtil.close(conn, pstmt);
      		}
      
      		return boardlist;
      	}

    • list.jsp

      <%@page import="kr.co.jsp.board.model.BoardVO"%>
      <%@page import="java.util.List"%>
      <%@page import="kr.co.jsp.board.model.BoardDAO"%>
      <%@ page language="java" contentType="text/html; charset=UTF-8"
          pageEncoding="UTF-8"%>
      <!DOCTYPE html>
      
      	<%
      	   //BoardDAO 클래스의 selectAll() 을 호출하여
      	   //DB에 들어있는 모든 글들을 list로 받아 오셔야 합니다.
      	   //리턴값으로 받은 리스트를 body태그에 반복문을 사용하여 하나씩 작성 (테이블 형식으로).
      	   //번호, 작성자, 제목, 비고(삭제)
      	   //조건문을 사용하여 DB에서 얻어온 글이 하나도 없을 때는
      	   //게시글이 존재하지 않는다 라는 글을 출력해 주세요.
      	%>
      	
      	<%
      		BoardDAO dao = BoardDAO.getInstance();
      		// 주소값 받아옴 
      		List<BoardVO> boardlist = dao.selectAll();
      		// 모두 조회한 값 받아옴
      	%>
      <html>
      <head>
      <meta charset="UTF-8">
      <title>Insert title here</title>
      </head>
      <body>
      
      	<h1> 게시글 목록 </h1>
      
      	<% if (boardlist.size() > 0 ) {%>
      	<table border = "3">
      		<tr>
      			<th>name</th>
      			<th>writer</th>
      			<th>title</th>
      			<th>etc</th>
      		</tr>
      		
      		<% for (BoardVO board : boardlist){ %>
      		<tr>
      			<td><%= board.getBoardId() %></td>
      			
      			<td><%= board.getWriter() %></td>
      			<td><%= board.getTitle() %></td>
      			<!-- board객체에서 값을 get -->
      			<td>
      				<a href = "delete.jsp">
      				삭제
      				</a>
      			</td>
      		</tr>
      		<%} %>
      		<%} else{ %>
      		<h3>게시글이 존재하지 않습니다!</h3>
      		<a href = "write.jsp">새 글 쓰기</a>
      		<%} %>
      	
      	
      	</table>
      </body>
      </html>

  • SelectOne
    • 하나의 데이터를 조회하는 기능

    • BoardDAO

      @Override
      	public BoardVO selectOne(int num) {
      		String sql = "SELECT * FROM board WHERE Board_ID = ?";
      		BoardVO vo = null;
      		try {
      			conn = getConnection();
      			pstmt = conn.prepareStatement(sql);
      			pstmt.setInt(1, num);
      			rs = pstmt.executeQuery();
      			// DB연결 수행 및 Query에 값을 넣어주고 Query 실행
      
      			if (rs.next()) {
      				vo = new BoardVO(rs.getInt("Board_ID"), rs.getString("WRITER"), rs.getString("TITLE"),
      						rs.getString("CONTENT"), rs.getTimestamp("REG_DATE"));
      			}
      			// 값이 하나이므로 반복문보다는 조건문이 좋을 것 같음
      			
      		} catch (Exception e) {
      			// TODO Auto-generated catch block
      			e.printStackTrace();
      		} finally {
      			JdbcUtil.close(conn, pstmt);
      		}
      		return vo;
      		// 전역변수로 BoardVO 객체를 생성해주고 그 값을 try문에서 넣어주고 BoardVO 객체를 리턴
      
      	}

    • content.jsp

      <%@page import="kr.co.jsp.board.model.BoardVO"%>
      <%@page import="kr.co.jsp.board.model.BoardDAO"%>
      <%@ page language="java" contentType="text/html; charset=UTF-8"
          pageEncoding="UTF-8"%>
      <!DOCTYPE html>
      
      	<%
      		int id = Integer.parseInt(request.getParameter("bID"));
      		// 요청과 함께 넘어오는 파라미터값(글 번호)을 얻어와서 
      		// DAO의 selectOne() 호출하여 객체를 와야함
      		BoardDAO dao = BoardDAO.getInstance();
      		BoardVO vo = dao.selectOne(id);
      		// 요청과 함께 넘어오는 파라미터값을 기준으로 객체를 반환하는 메서드를 작성해서 객체 반환
      	%>
      <html>
      <head>
      <meta charset="UTF-8">
      <title>Insert title here</title>
      </head>
      <body>
      
      <h1> <%= vo.getBoardId() %> 번 게시물 내용</h1>
      
      <p>
      	# 작성자 : <%= vo.getWriter() %> <br>
      	# 제목 : <%= vo.getTitle() %> <br>
      	# 내용 : <br>
      	<textarea rows="5" readonly><%= vo.getContent() %></textarea><br>
      	# 작성일 : <%= vo.getRegDate() %> <br>
      </p>
      
      <a href = "list.jsp">글 목록 보기</a>
      <a href="update.jsp?bID=<%=vo.getBoardId() %>" >글 수정</a>
      <!-- 값을 수정하기 위해서는 id값이 있어야 하기 때문에 update에도 값을 보내줘서 값을 기준으로 다시 찾아서 수정하도록 로직을 진행 -->
      
      </body>
      </html>

DELETE

  • Delete
    • Board_id값을 통해 데이터 삭제

    • BoardDAO

      @Override
      	public boolean delete(int num) {
      		boolean flag = false;
      		String sql = "DELETE FROM BOARD WHERE BOARD_ID = ?";
      		try {
      			conn = getConnection();
      			pstmt = conn.prepareStatement(sql);
      			pstmt.setInt(1, num);
      			
      			int rn = pstmt.executeUpdate();
      			
      			if (rn == 1) {
      				flag = true;
      			}
      		}catch (Exception e) {
      			// TODO Auto-generated catch block
      			e.printStackTrace();
      		} finally {
      			JdbcUtil.close(conn, pstmt);
      		}
      		return flag;
      	}

    • delete.jsp

      <%@page import="kr.co.jsp.board.model.BoardDAO"%>
      <%@ page language="java" contentType="text/html; charset=UTF-8"
          pageEncoding="UTF-8"%>
      
      	<%
      		int num = Integer.parseInt(request.getParameter("bID"));
      		// list.jsp에서 받아온 아이디 
      		
      		BoardDAO dao = BoardDAO.getInstance();
      		boolean flag = dao.delete(num);
      	%>
      
      	<%
      		if (flag){
      	%>
      	<h2> 삭제가 완료되었습니다.</h2>
      	<a href = "write.jsp">글 작성 이동</a>
      	
      	<%} else { %>
      	<h2> 삭제가 완료되지 못했습니다.</h2>
      	<a href = "list.jsp">글 목록 이동</a>
      	<%} %>
profile
안녕하세요! 공부한 내용을 기록하는 공간입니다.

0개의 댓글