학습목표
게시판 수정, 삭제를 구현할 수 있다.
DataSource를 이용한 Connection Pool 이용 방법에 대해 설명할 수 있다.
게시판 수정. 삭제
게사판의 글 수정 - 이미 저장된 데이터를 수정(업데이트)
게시판의 글 삭제 - 관리자만 글 삭제 가능
JDBC Program 절차
- JDBC Driver Loading
- Connection
- Statement 객체 생성
- SQL 문 실행
- 결과 이용
- close
Connection 관리의 필요성
성능상 가장 큰 영향을 미치는 부분이 데이터베이스와 Connection을 맺는 부분
- DBMS 프로그램에서 Connection 관리는 시스템의 성능과 안정성에 큰 영향을 미침
- 불필요한 연결에 의한 서버자원 낭비의 경우가 발생함
Connection Pool
- 미리 일정 수의 Connection을 만들어 놓고 이용하도록 하는 방법
- Connection Pool에 데이터베이스와 연동하기 위한 Connection 객체들을 준비함
- Container 구동 시 일정수의 Connection 객체가 생성하게 됨
- 애플리케이션에서는 Connection Pool에서 Connection 객체를 받아와 사용함
- 작업이 끝나면 다시 Connection Pool에 반납하는 과정을 거침
- 미리 설정한 최대 Connection 수 만큼 증가하도록 하여 원활한 서비스가 되도록 지원함
- 검증된 Connection Pool을 이용하여 대부분의 웹 애플리케이션에서 Service 기능으로 제공하고 있음
DataSource
- Connection Pool의 Connection을 관리하기 위한 객체 (관리자 역할)
- JNDI Service를 통해서 이용됨
- Data Source 객체를 통해서 필요한 Connection 획득, 반납 등의 작업을 함
DataSource 이용 절차
- JNDI Server에서 lookup 메서드를 통해 DataSource 객체 획득
- DataSource 객체의 getConnection 메서드를 통해서 Connection Pool에서 Free 상태의 Connection 획득
- Connection 객체를 통한 DBMS 작업 수행
- 모든 작업이 끝나면 DataSource 객체를 통해서 Connection Pool에 Connection 반납
Tomcat의 DataSource 설정
context.xml (톰캣의 환경파일)
<Resource
name="jdbc/h2"
auth="Container"
type="javax.sql.DataSource"
driverClassName="org.h2.Driver"
url="jdbc:h2:tcp//localhost/~/test"
username="sa"
password=""
maxActive="50"
maxWait="-1" />
- name : DataSource에 대한 JNDI 이름
- type : JNDI로 서비스하는 객체 타입
- auth : 인증주체
- maxActive : 동시에 서비스 가능한 최대 Connection 수
DataSource 이용
Context ctx = new InitialContext();
Context envContext = (Context) ctx.lookup("java:/comp/env");
DataSource dataFactory = (DataSource) envContext.lookup("jdbc/h2");
Connection con = dataFactory.getConnection();
실습
BoardDAO,java 파일 확인
업데이트, 삭제 시에 이용될 SQL문 추가
private static String BOARD_UPDATE =
"update board set title=?, content=? where seq=?";
private static String BOARD_DELETE =
"delete board where seq=?";
하나의 게시글을 Select 하기 위한 SQL 문 등록
private static String BOARD_GET = "select * from board where seq=?";
각각의 SQL 문을 실행시킬 수 있는 함수 등록
1. 업데이트시 실행되는 함수
public void updateBoard(BoardVO vo) {
try {
conn = JDBCUtil.getConnection();
stmt = conn.prepareStatement(BOARD_UPDATE);
stmt.setString(1, vo.getTitle());
stmt.setString(2, vo.getContent());
stmt.setInt(3, vo.getSeq());
stmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.close(stmt, conn);
}
}
2. 삭제 시 실행되는 함수
public void deleteBoard(BoardVO vo) {
try {
conn = JDBCUtil.getConnection();
stmt = conn.prepareStatement(BOARD_DELETE);
stmt.setInt(1, vo.getSeq());
stmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.close(stmt, conn);
}
}
글 하나의 상세보기를 위해서 호출되는 함수 정의
Select 이므로 리턴 값은 결과값이 있어야 함
public BoardVO getBoard(BoardVO vo) {
BoardVO board = null;
try {
conn = JDBCUtil.getConnection();
stmt = conn.prepareStatement(BOARD_GET);
// where 조건의 물음표를 글 번호로 지정한 후, Query 함수로 결과 값 실행
stmt.setInt(1, vo.getSeq());
rs = stmt.executeQuery();
if(rs.next()) {
board = new BoardVO();
board.setSeq(rs.getInt("SEQ"));
board.setTitle(rs.getString("TITLE"));
board.setWriter(rs.getString("WRITER"));
board.setContent(rs.getString("CONTENT"));
board.setRegDate(rs.getDate("REGDATE"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.close(rs, stmt, conn);;
}
return board;
}
글 내용의 요청을 처리하기 위한 Controller
GetBoardController.java
package controller.board;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import biz.board.BoardDAO;
import biz.board.BoardVO;
import controller.Controller;
public class GetBoardController implements Controller {
@Override
public String handleRequest(HttpServletRequest request, HttpServletResponse response) {
String seq = request.getParameter("seq");
// 클라이언트가 요청했을 때 넘어오는 글 번호를 VO에 담음
BoardVO vo = new BoardVO();
vo.setSeq(Integer.parseInt(seq));
BoardDAO dao = new BoardDAO();
BoardVO board = dao.getBoard(vo);
request.setAttribute("board", board);
return "getBoard.jsp";
}
}
유저가 글 수정 후 Submit 버튼 눌렀을 때 실행되는 Controller 이므로 유저가 전달한 데이터 추출
UpdateBoardController.java
package controller.board;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import biz.board.BoardDAO;
import biz.board.BoardVO;
import controller.Controller;
public class UpdateBoardController implements Controller{
@Override
public String handleRequest(HttpServletRequest request, HttpServletResponse response) {
String title = request.getParameter("title");
String seq = request.getParameter("seq");
String content = request.getParameter("content");
// 유저가 입력한 데이터를 VO에 담음
BoardVO vo = new BoardVO();
vo.setTitle(title);
vo.setSeq(Integer.parseInt(seq));
vo.setContent(content);
BoardDAO dao = new BoardDAO();
dao.updateBoard(vo);
// 목록화면으로 화면 전환
return "getBoardList.do";
}
}
DeleteBoardController.java
package controller.board;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import biz.board.BoardDAO;
import biz.board.BoardVO;
import controller.Controller;
public class DeleteBoardController implements Controller {
@Override
public String handleRequest(HttpServletRequest request, HttpServletResponse response) {
// 유저가 전달한 값 추출하여 BoardVO에 담음
String seq = request.getParameter("seq");
BoardVO vo = new BoardVO();
vo.setSeq(Integer.parseInt(seq));
BoardDAO dao = new BoardDAO();
dao.deleteBoard(vo);
// 목록화면으로 화면 전환
return "getBoardList.do";
}
}
HandllerMapping에 Controller 3개 등록
mappings.put("/updateBoard.do", new UpdateBoardController());
mappings.put("/deleteBoard.do", new DeleteBoardController());
mappings.put("/getBoard.do", new GetBoardController());
글 상세보기 기능을 하는 JSP 페이지 필요함
getBoard.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<h1>글 상세보기</h1>
<hr/>
<!-- 글을 상세보기 하면서 바로 수정할 수 있도록 화면을 제공함 -->
<form action="updateBoard.do" method="post">
<!-- But 글 번호는 유저가 입력할 필요가 없으므로 hidden으로 준비함 -->
<input name="seq" type="hidden" value="${board.seq }"/>
<table border="1">
<tr>
<td>title</td>
<td><input name="title" type="text" value="${board.title }"></td>
</tr>
<tr>
<td>writer</td>
<!-- 유저에게 수정대상에서 제외 -->
<td>${board.writer }</td>
</tr>
<tr>
<td>content</td>
<td><textarea name="content" cols="40" rows="10" >
${board.content }
</textarea></td>
</tr>
<tr>
<td>date</td>
<td>${board.regDate }</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="update"/>
</td>
</tr>
</table>
</form>
<hr/>
<!-- 신규 글을 등록할 수 있는 링크 제공 -->
<a href="insertBoard.html">add board</a>
<br/>
<!-- if Tag 사용하여 Admin만 삭제하도록 작성 -->
<c:if test="${user.role == 'Admin' }">
<a href="deleteBoard.do?seq=${board.seq }">delete</a>
</c:if>
<br/>
<!-- 목록으로 넘어갈 수 있는 링크 제공 -->
<a href="getBoardList.do">list</a>
</body>
</html>
테스트
login.html
title에 있는 링크를 눌렀을 때 상세보기 및 업데이트 화면으로 넘어가면 성공
title 부분을 수정하고 update 버튼을 눌렀을 때 BoardList쪽에 반영되는지 테스트
title 22 -> 22a로 수정됨
로그아웃 후 admin으로 로그인
admin으로 로그인하면 글 상세보기 들어갔을 때 delete가 추가됨
delete를 눌렀을 때 삭제되면 성공
오...
되다니 의왼걸
JSP & Serlvet 강의 완..! 진짜 따라해보기만 했다 ㅎ.. 응용은 언제쯤..?
이제 다음 강의 들으러 가자 .. ^-^..ㅠ
'온라인 강좌 > JSP & Servlet 활용' 카테고리의 다른 글
21차시 Project - 게시판 등록, 조회 (0) | 2023.07.05 |
---|---|
20차시 Project - 인증 (0) | 2023.07.05 |
19차시 Project - 회원등록 (1) | 2023.07.05 |
18차시 Project - 환경 구축 (0) | 2023.07.04 |
17차시 Spring Boot (0) | 2023.07.04 |