package com.fastcampus.ch4.dao;
import com.fastcampus.ch4.domain.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
@Repository
public class UserDaoImpl implements UserDao {
@Autowired
DataSource ds;
@Override
public int deleteUser(String id) throws Exception {
int rowCnt = 0;
String sql = "DELETE FROM user_info WHERE id= ? ";
try ( // try-with-resources - since jdk7
Connection conn = ds.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql);
){
pstmt.setString(1, id);
return pstmt.executeUpdate(); // insert, delete, update
// } catch (Exception e) {
// e.printStackTrace();
// throw e;
}
}
@Override
public User selectUser(String id) throws Exception {
User user = null;
String sql = "SELECT * FROM user_info WHERE id= ? ";
try (
Connection conn = ds.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql);
){
pstmt.setString(1, id);
ResultSet rs = pstmt.executeQuery(); // select
if (rs.next()) {
user = new User();
user.setId(rs.getString(1));
user.setPwd(rs.getString(2));
user.setName(rs.getString(3));
user.setEmail(rs.getString(4));
user.setBirth(new Date(rs.getDate(5).getTime()));
user.setSns(rs.getString(6));
user.setReg_date(new Date(rs.getTimestamp(7).getTime()));
}
}
return user;
}
// 사용자 정보를 user_info테이블에 저장하는 메서드
@Override
public int insertUser(User user) throws Exception {
int rowCnt = 0;
String sql = "INSERT INTO user_info VALUES (?,?,?,?,?,?, now()) ";
try(
Connection conn = ds.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql); // SQL Injection공격, 성능향상
){
pstmt.setString(1, user.getId());
pstmt.setString(2, user.getPwd());
pstmt.setString(3, user.getName());
pstmt.setString(4, user.getEmail());
pstmt.setDate(5, new java.sql.Date(user.getBirth().getTime()));
pstmt.setString(6, user.getSns());
return pstmt.executeUpdate();
}
}
@Override
public int updateUser(User user) throws Exception {
int rowCnt = 0;
String sql = "UPDATE user_info " +
"SET pwd = ?, name=?, email=?, birth =?, sns=?, reg_date=? " +
"WHERE id = ? ";
try (
Connection conn = ds.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql);
){
pstmt.setString(1, user.getPwd());
pstmt.setString(2, user.getName());
pstmt.setString(3, user.getEmail());
pstmt.setDate(4, new java.sql.Date(user.getBirth().getTime()));
pstmt.setString(5, user.getSns());
pstmt.setTimestamp(6, new java.sql.Timestamp(user.getReg_date().getTime()));
pstmt.setString(7, user.getId());
rowCnt = pstmt.executeUpdate();
}
return rowCnt;
}
@Override
public int count() throws Exception {
String sql = "SELECT count(*) FROM user_info ";
try(
Connection conn = ds.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
){
rs.next();
int result = rs.getInt(1);
return result;
}
}
@Override
public void deleteAll() throws Exception {
try (Connection conn = ds.getConnection();)
{
String sql = "DELETE FROM user_info ";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.executeUpdate();
}
}
}
UserDaoImple만들고 refacter -> extract inerface로 만듬
package com.fastcampus.ch4.dao;
import com.fastcampus.ch4.domain.*;
public interface UserDao {
User selectUser(String id) throws Exception;
int deleteUser(String id) throws Exception;
int insertUser(User user) throws Exception;
int updateUser(User user) throws Exception;
int count() throws Exception;
void deleteAll() throws Exception;
}
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>fastcampus</title>
<link rel="stylesheet" href="<c:url value='/css/menu.css'/>">
</head>
<body>
<div id="menu">
<ul>
<li id="logo">fastcampus</li>
<li><a href="<c:url value='/'/>">Home</a></li>
<li><a href="<c:url value='/board/list'/>">Board</a></li>
<li><a href="<c:url value='/login/login'/>">login</a></li>
<li><a href="<c:url value='/register/add'/>">Sign in</a></li>
<li><a href=""><i class="fas fa-search small"></i></a></li>
</ul>
</div><div style="text-align:center">
<table border="1">
<tr>
<th>번호</th>
<th>제목</th>
<th>이름</th>
<th>등록일</th>
<th>조회수</th>
</tr>
<c:forEach var="board" items="${list}">
<tr>
<td>${board.bno}</td>
<td>${board.title}</td>
<td>${board.writer}</td>
<td>${board.reg_date}</td>
<td>${board.view_cnt}</td>
</tr>
</c:forEach>
</table>
<br>
<div>
<c:if test="${ph.showPrev}">
<a href="<c:url value='/board/list?page=${ph.beginPage-1}&pageSize=${ph.pageSize}'/>"><</a>
</c:if>
<c:forEach var="i" begin="${ph.beginPage}" end="${ph.endPage}">
<a href="<c:url value='/board/list?page=${i}&pageSize=${ph.pageSize}'/>">${i}</a>
</c:forEach>
<c:if test="${ph.showNext}">
<a href="<c:url value='/board/list?page=${ph.endPage+1}&pageSize=${ph.pageSize}'/>">></a>
</c:if>
</div>
</div>
</body>
</html>
package com.fastcampus.ch4.domain;
public class PageHandler {
private int totalCnt; //총 게시물 개수
private int pageSize; //한 페이지의 크기
private int naviSize = 10; //페이지 내비게이션의 크기
private int totalPage; //전체 페이지의 개수
private int page; //현재 페이지
private int beginPage; //내비게이션의 첫번째 페이지
private int endPage; //내비게이션의 마지막 페이지
private boolean showPrev; //이전 페이지로 이동하는 링크를 보여줄 것이지의 여부
private boolean showNext; //다음 페이지로 이동하는 링크를 보여줄 것인지의 여부
public PageHandler(int totalCnt, int page){
this(totalCnt, page, 10);
}
public PageHandler(int totalCnt, int page, int pageSize) {
this.totalCnt = totalCnt;
this.page = page;
this.pageSize = pageSize;
totalPage = (int)Math.ceil(totalCnt / (double)pageSize);
beginPage = (page-1) / naviSize * naviSize + 1;
endPage = Math.min(beginPage + naviSize - 1, totalPage);
showPrev = beginPage != 1;
showNext = endPage != totalPage;
}
public int getTotalCnt() {
return totalCnt;
}
public void setTotalCnt(int totalCnt) {
this.totalCnt = totalCnt;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getNaviSize() {
return naviSize;
}
public void setNaviSize(int naviSize) {
this.naviSize = naviSize;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public int getBeginPage() {
return beginPage;
}
public void setBeginPage(int beginPage) {
this.beginPage = beginPage;
}
public int getEndPage() {
return endPage;
}
public void setEndPage(int endPage) {
this.endPage = endPage;
}
public boolean isShowPrev() {
return showPrev;
}
public void setShowPrev(boolean showPrev) {
this.showPrev = showPrev;
}
public boolean isShowNext() {
return showNext;
}
public void setShowNext(boolean showNext) {
this.showNext = showNext;
}
void print() {
System.out.println("page = " + page);
System.out.print(showPrev ? "[PREV] " : "");
for (int i = beginPage; i <= endPage; i++) {
System.out.print(i+" ");
}
System.out.println(showNext ? " [NEXT] " : "");
}
@Override
public String toString() {
return "PageHandler{" +
"totalCnt=" + totalCnt +
", pageSize=" + pageSize +
", naviSize=" + naviSize +
", totalPage=" + totalPage +
", page=" + page +
", beginPage=" + beginPage +
", endPage=" + endPage +
", showPrev=" + showPrev +
", showNext=" + showNext +
'}';
}
}
TDD
package com.fastcampus.ch4.domain;
import org.junit.Test;
import static org.junit.Assert.*;
public class PageHandlerTest {
@Test
public void test(){
PageHandler ph = new PageHandler(250, 1);
ph.print();
System.out.println("ph = " + ph);
assertTrue(ph.getBeginPage() == 1);
assertTrue(ph.getEndPage() == 10);
}
@Test
public void test2(){
PageHandler ph = new PageHandler(250, 11);
ph.print();
System.out.println("ph = " + ph);
assertTrue(ph.getBeginPage() == 11);
assertTrue(ph.getEndPage() == 20);
}
@Test
public void test3(){
PageHandler ph = new PageHandler(255, 25);
ph.print();
System.out.println("ph = " + ph);
assertTrue(ph.getBeginPage() == 21);
assertTrue(ph.getEndPage() == 26);
}
@Test
public void test4(){
PageHandler ph = new PageHandler(255, 10);
ph.print();
System.out.println("ph = " + ph);
assertTrue(ph.getBeginPage() == 1);
assertTrue(ph.getEndPage() == 10);
}
}