능글맞은 구렁이
게시판 만들기 (DAO와 DTO적용) 본문
1. DAO
DAO란 Data Access Object의 약자이다.
웹 애플리케이션을 작성할 때에는 데이터베이스에 관련된 코드를 모두 하나의 클래스에 몰아놓고, 애플리케이션의 다른 곳에서는 그 객체의 메서드만 호출할 뿐, 직접 데이터베이스에 접근하는 코드를 가지지 않도록 작성하는것이 일반적이며, 데이터 베이스에 관련된 코드가 모두 모여있는 클래스의 객체를 DAO라한다.
2. DTO
DTO란 Data Transfer Object의 약자이다.
웹 애플리케이션을 작성하다 보면 애플리케이션을 구성하는 모듈끼리 레코드데이터를 주고받아야 하는 경우가 종종 있는데, 이를 위해서 데이터베이스 테이블과 똑같은 구조를 가진 클래스를 정의해서, 하나의 레코드 데이터를 이 객체에 담아 사용하는데 이를 바로 DTO라고 한다.
시작은 list.jsp에서 run해야한다.
*BoardDAO*
package com.board.db;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.time.LocalDate;
import java.time.LocalTime;
import java.util.ArrayList;
public class BoardDAO {
String Driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
String id = "test";
String pwd = "1234";
Connection conn = null;
Statement stmt = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
public BoardDAO() {
}
/** 현재시간을 알아내는 메서드 **/
public String getCurrentime() {
return LocalDate.now() + "" + LocalTime.now().toString().substring(0, 8);
}
/** 게시글 삭제 메서드 **/
public void delete(int num) {
try {
Class.forName(Driver);
conn = DriverManager.getConnection(url, id, pwd);
String sql = "delete from board where num=" + num;
stmt = conn.createStatement();
stmt.executeQuery(sql);
} catch (ClassNotFoundException e) {
System.out.print("dirver err:" + e.getMessage());
} catch (SQLException e) {
System.out.print("select err:" + e.getMessage());
}
}
/** 게시글보기 메서드 **/
public BoardDTO view(int num, boolean incHits) {
BoardDTO dto = new BoardDTO();
try {
Class.forName(Driver);
conn = DriverManager.getConnection(url, id, pwd);
String sql = "select * from board where num=" + num;
stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
if (rs.next()) {
// 글 데이터를 변수에 저장
dto.setNum(rs.getInt("num"));
dto.setWriter(rs.getString("writer"));
dto.setTitle(rs.getString("title"));
dto.setContent(rs.getString("content"));
dto.setRegtime(rs.getString("regtime"));
dto.setHits(rs.getInt("hits"));
// 이 글의 조회수를 1 올림
if (incHits) {
stmt.executeUpdate("update board set hits=hits+1 where num=" + num);
}
}
} catch (ClassNotFoundException e) {
System.out.print("dirver err:" + e.getMessage());
} catch (SQLException e) {
System.out.print("select err:" + e.getMessage());
}
return dto;
}
/** insert 메서드 **/
public void insert(BoardDTO dto) {
try {
Class.forName(Driver);
conn = DriverManager.getConnection(url, id, pwd);
String sql = "insert into board (num, writer, title, content, regtime, hits) values (?,?,?,?,?,0)";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, dto.getNum());
pstmt.setString(2, dto.getWriter());
pstmt.setString(3, dto.getTitle());
pstmt.setString(4, dto.getContent());
pstmt.setString(5, getCurrentime());
pstmt.executeUpdate();
} catch (ClassNotFoundException e) {
System.err.println("접속err:" + e.getMessage());
} catch (SQLException e) {
System.err.println("insert err:" + e.getMessage());
}
}
/** update 메서드 **/
public void update(BoardDTO dto) {
try {
Class.forName(Driver);
conn = DriverManager.getConnection(url, id, pwd);
String sql = "update board set writer=?, title=?, content=?, regtime=? where num=?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, dto.getWriter());
pstmt.setString(2, dto.getTitle());
pstmt.setString(3, dto.getContent());
pstmt.setString(4, getCurrentime());
pstmt.setInt(5, dto.getNum());
pstmt.executeUpdate();
} catch (ClassNotFoundException e) {
System.err.println("접속err:" + e.getMessage());
} catch (SQLException e) {
System.err.println("insert err:" + e.getMessage());
}
}
/** list 메서드 **/
public ArrayList<BoardDTO> list() {
ArrayList<BoardDTO> alist = new ArrayList<BoardDTO>();
try {
Class.forName(Driver);
Connection conn = DriverManager.getConnection(url, id, pwd);
String sql = "select * from board order by num desc";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
BoardDTO dto = new BoardDTO();
dto.setNum(rs.getInt("num"));
dto.setTitle(rs.getString("title"));
dto.setWriter(rs.getString("writer"));
dto.setContent(rs.getString("content"));
dto.setRegtime(rs.getString("regtime"));
dto.setHits(rs.getInt("hits"));
alist.add(dto);
}
} catch (ClassNotFoundException e) {
System.err.println("게시글 리스트 접속 err:" + e.getMessage());
} catch (SQLException e) {
System.err.println("게시글 리스트 읽어오기 err:" + e.getMessage());
}
return alist;
}
}
*BoardDTO*
package com.board.db;
public class BoardDTO {
private int num=0;
private String writer =null;
private String title =null;
private String content =null;
private String regtime =null;
private int hits=0;
public BoardDTO() {
}
public int getNum() {
return num;
}
public String getWriter() {
return writer;
}
public String getTitle() {
return title;
}
public String getContent() {
return content;
}
public String getRegtime() {
return regtime;
}
public int getHits() {
return hits;
}
public void setNum(int num) {
this.num = num;
}
public void setWriter(String writer) {
this.writer = writer;
}
public void setTitle(String title) {
this.title = title;
}
public void setContent(String content) {
this.content = content;
}
public void setRegtime(String regtime) {
this.regtime = regtime;
}
public void setHits(int hits) {
this.hits = hits;
}
}
list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<%@ page import="com.board.db.*" %>
<%
//게시글이 담긴 dto 객체들의 리스트를 얻음
ArrayList<BoardDTO> alist=new BoardDAO().list();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시글 리스트 화면</title>
<style>
table{width: 680px; text-align: center;}
th{background-color:cyan;}
.num{width: 80px;}
.title{width: 230px;}
.writer{width: 100px;}
.regtime{width: 180px;}
a:link{text-decoration: none; color: blue;}
a:visited{text-decoration: none; color: gray;}
a:hover{text-decoration: none; color:red;}
</style>
</head>
<body>
<table>
<tr>
<th class="num">번호</th>
<th class="title">제목</th>
<th class="writer">작성자</th>
<th class="regtime">작성일시</th>
<th>조회수</th>
</tr>
<%
//리스트의 모든 dto 객체의 내용을 화면에 출력
for(BoardDTO dto: alist){
%>
<tr>
<td><%= dto.getNum() %></td>
<td style="text-align:left;"><a href="view.jsp?num=<%=dto.getNum() %>"><%=dto.getTitle() %></a></td>
<td><%=dto.getWriter() %></td>
<td><%=dto.getRegtime() %></td>
<td><%=dto.getHits() %></td>
</tr>
<%
}
%>
</table>
<br/>
<input type="button" value="글쓰기" onclick="location.href='write.jsp'"><!-- button클릭시 write.jsp 이동 -->
</body>
</html>
*insert.jsp*
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="com.board.db.*" %>
<%
request.setCharacterEncoding("UTF-8");
//양식에 입력되었던 값 읽기
String writer=request.getParameter("writer");
String title=request.getParameter("title");
String content=request.getParameter("content");
//빈 칸이 하나라도 있으면 오류 출력하고 종료
if(writer ==null || writer.length()==0||title==null||title.length()==0||content==null||content.length()==0){
%>
<script>
alert('모든 항목이 빈칸 없이 입력되어야 합니다.');
history.back();
</script>
<%
return;
}
//글 데이터를 DTO에 저장
BoardDTO dto=new BoardDTO();
dto.setWriter(writer);
dto.setTitle(title);
dto.setContent(content);
//입력된 내용으로 새 글 레코드 추가
new BoardDAO().insert(dto);
//목록보기 화면으로 돌아감
response.sendRedirect("list.jsp");
%>
*update.jsp*
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="com.board.db.*" %>
<%
request.setCharacterEncoding("UTF-8");
//업데이트할 글 번호 얻기
int num=Integer.parseInt(request.getParameter("num"));
//양식에 입력되었던 값 일기
String writer=request.getParameter("writer");
String title=request.getParameter("title");
String content=request.getParameter("content");
//빈칸이 하나라도 있으면 오류 출력하고 종료
if(writer ==null || writer.length()==0||
title == null || title.length()==0 ||
content==null || content.length()==0){
%>
<script>
alert('모든 항목이 빈칸 없이입력되어야 합니다.');
history.back();
</script>
<%
return;
}
//글 데이터를 DTO에 저장
BoardDTO dto=new BoardDTO();
dto.setNum (num);
dto.setWriter(writer);
dto.setTitle(title);
dto.setContent(content);
//입력된 내용으로 새 글 레코드 추가
new BoardDAO().update(dto);
//글 보기 화면으로 돌아감
response.sendRedirect("view.jsp?num="+num);
%>
*view.jsp*
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@page import="com.board.db.*"%>
<%
//지정된 글 번호 얻기
int num=Integer.parseInt(request.getParameter("num"));
BoardDTO dto=new BoardDAO().view(num, true);
//글제목과 내용이 웹 페이지에 올바르게 출력되도록 공백과 줄 바꿈 처리
dto.setTitle(dto.getTitle().replace("", " "));
dto.setContent(dto.getContent().replace(" ", " ").replace("\n", "<br />"));
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>글 내용 보기 화면</title>
<style>
table{ width: 680px; text-align: center;}
th{ width: 100px; background-color: cyan;}
td{ text-align: left; border: 1px solid gray;}
</style>
</head>
<body>
<table>
<tr>
<th>제목</th>
<td><%=dto.getTitle() %></td>
</tr>
<tr>
<th>작성자</th>
<td><%=dto.getWriter() %></td>
</tr>
<tr>
<th>작성일자</th>
<td><%=dto.getRegtime() %></td>
</tr>
<tr>
<th>조회수</th>
<td><%=dto.getHits() %></td>
</tr>
<tr>
<th>내용</th>
<td><%=dto.getContent() %></td>
</tr>
</table><br/>
<input type="button" value="목록보기" onclick="location.href='list.jsp'" >
<input type="button" value="수정" onclick="location.href='write.jsp?num=<%=num%>'">
<input type="button" value="삭제" onclick="location.href='delete.jsp?num=<%=num%>'">
</body>
</html>
*write.jsp*
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@page import="com.board.db.*"%>
<%
/**글 번호가 주어지지 않으면 insert()로 글번호가 주어지면 update()로**/
//글번호 값 얻기, 주어지지 않았으면 0으로 설정
String tmp=request.getParameter("num");
int num=(tmp!=null&& tmp.length()>0)? Integer.parseInt(tmp):0;
//새글쓰기 모드를 가정하고 변수 초기값 설정
BoardDTO dto=new BoardDTO();
String action="insert.jsp";
//글 번호가주어졌으면, 글 수정 모드
if(num>0){
dto = new BoardDAO().view(num, false);
action="update.jsp?num"+num;
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>글쓰기 화면</title>
<style>
table{width: 680px; text-align: center;}
th{width: 100px; background-color: cyan;}
input[type=text], textarea{width: 100%}
</style>
</head>
<body>
<form action="<%=action %>" method="post">
<table>
<tr>
<th>제목</th>
<td><input type="text" name="title" maxlength="80" value="<%=dto.getTitle()%>" /></td>
</tr>
<tr>
<th>작성자</th>
<td><input type="text" name="writer" maxlength="20" value="<%=dto.getWriter() %>" /></td>
</tr>
<tr>
<th>내용</th>
<td><textarea name="content" rows="10" ><%=dto.getContent() %></textarea></td>
</tr>
</table>
<br/>
<input type="submit" value="저장"> <!-- submit버튼클릭시 insert.jsp이동-->
<input type="button" value="취소" onclick="history.back()"> <!--history.back():실행직전으로돌아가기 -->
</form>
</body>
</html>
'Language > JSP' 카테고리의 다른 글
JSP-JSTL개념(1) (0) | 2021.06.03 |
---|---|
EL (0) | 2021.05.31 |
게시판 만들기(DTO DAO 적용전) (0) | 2021.05.24 |
JSP-JDBC(oracle) (0) | 2021.05.19 |
세션(Session) (0) | 2021.05.18 |
Comments