능글맞은 구렁이

게시판 만들기 (DAO와 DTO적용) 본문

Language/JSP

게시판 만들기 (DAO와 DTO적용)

보라색츄르 2021. 5. 24. 11:22

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("", "&nbsp;"));
	dto.setContent(dto.getContent().replace(" ", "&nbsp;").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