Project/최종 시연 및 후기

[JSP] 미니프로젝트 : 싸이월드 구현하기 (방명록/다이어리/게시글)

minulbora 2024. 1. 30. 22:13

테이블을 먼저 보자면, 위와 같다. 

기본 게시판, 다이어리, 방명록, 유저, 그리고 시간상의 관계로 구현하지는 못했지만 첨부파일도 테이블까지 만들어 둠. 

처음에는 몰랐는데 마지막에 아쉬웠던 점은 괜히 테이블을 3개나 만들어서 좀 비효율적이었다... 

그냥 한 번에 해서 게시판 종류까지 컬럼으로 넣을 걸 그랬다. 

처음 해 보는 거라서 있었던 시행착오.. 라고 생각한다. 

첫 페이지 (기본 페이지)

위 페이지에서 로그인과 회원가입이 가능합니다. 

 

<script>
$(document).ready(function(){
	$("#uId").focus();
	$("#signIn").on("click",function(){
		if($.trim($("#uId").val()).length <= 0){
			alert("아이디를 입력하세요.");
			$("#uId").val("");
			$("#uId").focus();
			return;
		}
		if($.trim($("#uPwd").val()).length <= 0){
			alert("비밀번호를 입력하세요.");
			$("#uPwd").val("");
			$("#uPwd").focus();
			return;
		}
		document.signInForm.submit();
	});
	$("#signUp").on("click",function(){
		location.href = "/user/userRegForm7.jsp";
	})
});



</script>

</head>
<body>
<div class="wrapper">
  <div class="container">
    <div class="sign-up-container">

    </div>
    <div class="sign-in-container">
      <form name="signInForm" id="signInForm" method="post" action="/loginProc7.jsp">
        <h1>Hi</h1>
        <div class="social-links">
        </div>
        <input type="text" name="uId" id="uId" placeholder="아이디">
        <input type="password" name="uPwd" id="uPwd" placeholder="비밀번호">
        <button class="form_btn" id="signIn" >로그인</button>
      </form>
    </div>
    <div class="overlay-container">
      <div class="overlay-right">
        <h1 class="font-kotra">Hello, Friend</h1>
        <p class="font-kyobohand">Enter your personal details and start journey with us</p>
        <button id="signUp" class="overlay_btn">회원가입</button>
      </div>
    </div>
  </div>
</div>
</body>
</html>

회원가입 페이지. 

아이디는 가입 완료 누르면 ajax로 중복 체크를 진행하도록 함.

나머지는 중복체크 없이 유효성 검사만 진행. 

 

첫 메인 페이지

이미지는 유저 파일에 프로필 사진을 넣지 않아 (넣어야 한다는 사실을 뒤늦게 깨달았으나 시간이 없었다.) 하드코딩했다. 

왼쪽 업데이트 뉴스는 게시판과 다이어리에서 최근 글 제목을 긁어온 것이고, (list) 오른쪽 다이어리는 총 게시글 게수다. 사진첩은 구현하지 못했기 때문에 0개... 

오른쪽 버튼은 네비게이션으로 넣었다. 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import = "org.apache.logging.log4j.LogManager" %>   
<%@ page import = "org.apache.logging.log4j.Logger" %>
<%@ page import = "com.sist.web.util.HttpUtil" %>
<%@ page import = "com.sist.common.util.StringUtil" %>
<%@ include file = "/include/head7.jsp" %>
<%@ page import = "com.sist.web.dao7.BoardDao7" %>
<%@ page import = "com.sist.web.dao7.UserDao7" %>
<%@ page import = "com.sist.web.model7.Diary7" %>
<%@ page import = "com.sist.web.model7.Board7" %>
<%@ page import = "com.sist.web.model7.GuestBook" %>
<%@ page import = "java.util.List" %>
<%@ page import = "com.sist.web.util.CookieUtil" %>
<%
BoardDao7 dao = new BoardDao7();
Diary7 diary7 = new Diary7();
Board7 board7 = new Board7();
GuestBook guest = new GuestBook();
diary7.setStartRow(0);
diary7.setEndRow(5);
board7.setStartRow(0);
board7.setEndRow(5);
List<Diary7> list1 = dao.DiaryList(diary7);
List<Board7> list2 = dao.BoardList(board7);

%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>

 <link rel="stylesheet" href="/resources/css/Cy-home.css" />
    <meta charset="UTF-8" />
    <title>2021 MINI HOMEPAGE</title>
  </head>
  <body>
    <div class="bookcover">
      <div class="bookdot">
        <div class="page">
          <div class="profile-container">
            <div class="header profile-title font-neo">
              TODAY<span class="color-red"> 28</span> | TOTAL 234918
            </div>
            <div class="box profile-box">
              <div class="profile-image">
                <img
                  class="profile-image-img"
                  src="/resources/images/profile2.jpg"
                  alt="프로필 이미지"
                />
              </div>
              <div class="profile-text font-kyobohand">
                ㄴr는.. 오늘도.. 눈물을.. 흘린ㄷr..★
              </div>
              <div class="profile-username font-kyobohand">
                <span style="color: #0f1b5c">이름</span> (♪♬)
              </div>
              <div class="profile-dropdown">
                <div class="dropdown-button">
                  <div class="dropdown-title">파도타기</div>
                  <div class="triangle-down"></div>
                </div>
                <div class="dropdown-content">
                  <a href="#" target="_blank">블로그 바로가기</a>
                  <a href="#" target="_blank">페이스북 바로가기</a>
                  <a href="#" target="_blank">인스타그램 바로가기</a>
                </div>
              </div>
            </div>
          </div>
          
          
          <div class="content-container">
            <div class="header content-title">
              <div class="content-title-name">example 추억 상ㅈr... (*ˊᵕˋo💐o</div>
              <div class="content-title-url">https://url주소/나중에입력</div>
            </div>
            
            
            <div class="box content-box">
              <div class="box-title">Updated news</div>
              <div class="news-flex-box">
                <div class="news-box">
                  
                  <% for(int i=0;i<2;i++){
                  Diary7 diary = list1.get(i);%>
                  	<div class="news-row">
                    <div class="news-category category-pic">일기장</div>
                    <div class="news-title"><%=diary.getdTitle()%></div>
                    </div>
                    <%}%>
                  
                  <%
                  for(int i=0;i<2;i++){
                  Board7 board = list2.get(i);%>
                  <div class="news-row">
                    <div class="news-category category-post">게시판</div>
                    <div class="news-title"><%=board.getbTitle()%></div>
                    </div>
                    <%}%>
                </div>
                <div class="update-box">
                  <div class="menu-row">
                    <div class="menu-item">다이어리<span class="menu-num"><%=dao.diaryTotalCnt()%>/25</span></div>
                    <div class="menu-item">사진첩<span class="menu-num">0/25</span></div>
                  </div>
                  <div class="menu-row">
                    <div class="menu-item">게시판<span class="menu-num"><%=dao.boardTotalCnt(board7)%>/25</span></div>
                    <div class="menu-item">방명록<span class="menu-num"><%=dao.GuestBookTotalCnt()%>/25</span></div>
                  </div>
                </div>
              </div>
              <div class="miniroom">
                <div class="box-title">Miniroom</div>
                <div class="miniroom-gif-box">
                  <img src="/resources/images/minihome.jpg" alt="미니룸 이미지 수정 필요함" />
                </div>
              </div>
            </div>
            
            
          </div>
          
		  <div class="menu-container">
            <%@ include file ="/include/navigation7.jsp" %>
          </div>
        </div>
      </div>
    </div>
  </body>
</html>

 

(Dao의 경우 마지막에 한번에 올리겠음.)

다이어리 버튼을 누르면 나오는 페이지다. 

다이어리는 싸이 주인(admin 계정)만 볼 수 있도록 처리했다. 

상세페이지 없이 바로 내용이 보이도록 했고, 5 개씩 보이도록 페이징 처리했다. 

저 페이지 블록 아래에는 글쓰기 버튼이 숨어있어 마우스를 가져다 대면 보인다. (비밀 일기)

저 날짜는 오늘 날짜가 보이도록 처리했고, 각각의 날짜들도 누르면 날짜에 쓰여진 일기가 보이도록 하고 싶었는데,

위 오류를 해결하지 못해... (...하루만 더 있다면...) 그냥 발표함.

<%@page import="com.sist.web.model7.BoardFileConfig7"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8"%>
<%@ page import = "org.apache.logging.log4j.LogManager" %>   
<%@ page import = "java.util.List" %>
<%@ page import = "org.apache.logging.log4j.Logger" %>
<%@ page import = "com.sist.web.util.HttpUtil" %>
<%@ page import = "com.sist.web.dao7.BoardDao7" %>
<%@ page import = "com.sist.web.model7.Board7" %>
<%@ page import = "com.sist.web.model7.Paging7" %>
<%@ page import = "com.sist.web.model.BoardFileConfig" %>
<%@ page import = "com.sist.common.util.StringUtil" %>



<%
	Logger logger = LogManager.getLogger("/board/boardList.jsp");
	HttpUtil.requestLogString(request, logger);
	
	int searchType= HttpUtil.get(request, "searchType",0);
	String searchValue=HttpUtil.get(request,"searchValue","");
	long curPage = HttpUtil.get(request, "curPage", (long)1);
	long totalCnt = 0;
	List<Board7> list = null;
	Paging7 paging = null;
	int secret = HttpUtil.get(request, "secret",0);
	
	BoardDao7 boardDao = new BoardDao7();
	Board7 board = new Board7();
	
	if(!StringUtil.isEmpty(searchType) && !StringUtil.isEmpty(searchValue)){
		if(searchType == 1){
			board.setuNickName(searchValue);
		}
		if(searchType == 2){
			board.setbTitle(searchValue);
		}
		if(searchType == 3){
			board.setbContent(searchValue);
		}
	}
	
	totalCnt = boardDao.boardTotalCnt(board); 
	logger.debug("총 게시물 수 : "+ totalCnt);
	
	if(totalCnt > 0){
		
		paging = new Paging7(totalCnt, 
				BoardFileConfig7.LCNT,BoardFileConfig7.PCNT,curPage);

		board.setStartRow(paging.getStartRow());
		board.setEndRow(paging.getEndRow());
		
		list = boardDao.BoardList(board);
		
	}
	
	
	
%>
<!DOCTYPE html>
<html>
<head>
<%@ include file="/include/head7.jsp" %>
<meta charset="UTF-8">
<title></title>
<script>
$(document).ready(function(){
	<%if(secret==1){%>
		alert("비밀글은 작성자만 열람 가능합니다!");
  		<% secret = 0;
	}%>
	$("#_searchType").change(function(){
		$("#_searchValue").val("");
	});
	
	$("#btnSearch").on("click",function(){
		if($("#_searchValue").val() == ""){
			alert("조회할 내용을 입력해 주세요.");
			$("_searchValue").focus();
			return;
		}
		document.bForm.boardN.value="";
		document.bForm.searchType.value = $("#_searchType").val();
		document.bForm.searchValue.value= $("#_searchValue").val();
		document.bForm.curPage.value="";
		document.bForm.action="/board/boardList.jsp";
		document.bForm.submit();
	});
	
	$("#writeBtn").on("click",function(){
		document.location.href="/board/write7.jsp";
	});
	
});

function fn_list(curPage){
	document.bForm.boardN.value="";
	document.bForm.curPage.value=curPage;
	document.bForm.action = "/board/boardList.jsp";
	document.bForm.submit();
}
function fn_view(boardN){
	document.bForm.boardN.value=boardN;
	document.bForm.action="/board/boardView7.jsp";
	document.bForm.submit();
}
</script>
</head>
 <link rel="stylesheet" href="/resources/css/Cy-home.css" />
<body>
    <div class="bookcover">
      <div class="bookdot">
        <div class="page">
          <div class="profile-container">
            <div class="header profile-title font-neo">
              TODAY<span class="color-red"> 28</span> | TOTAL 234918
            </div>
            <div class="box profile-box">
              <div class="profile-image">
                <img
                  class="profile-image-img"
                  src="/resources/images/profile2.jpg"
                  alt="프로필 이미지 수정"
                />
              </div>
              <div class="profile-text font-kyobohand">
                ㄴr는.. 오늘도.. 눈물을.. 흘린ㄷr..★
              </div>
              <div class="profile-text font-kyobohand">
                <span style="color: #0f1b5c">사용자</span> (♪♬)
              </div>
              <div class="profile-dropdown">
                <div class="dropdown-button">
                  <div class="dropdown-title">파도타기</div>
                  <div class="triangle-down"></div>
                </div>
                <div class="dropdown-content">
                  <a href="#" target="_blank">블로그 바로가기</a>
                  <a href="#" target="_blank">페이스북 바로가기</a>
                  <a href="#" target="_blank">인스타그램 바로가기</a>
                </div>
              </div>
            </div>
          </div>
          
          
          <div class="content-container">
            <div class="header content-title">
              <div class="profile-text font-kyobohand">사용자의 추억 상ㅈr... (*ˊᵕˋo💐o</div>
               
              
            </div>
            
            
            <div class="box content-box">
            <div class="profile-dropdown">
		         <select name="_searchType" id="_searchType" style="width:auto;">
		            <option value="" class="dropdown-title">조회 항목</option>
		            <option  class="dropdown-title"  value="1"<%if(searchType==1){ %>selected<%}%>>닉네임</option>
		            <option  class="dropdown-title"  value="2"<%if(searchType==2){ %>selected<%} %>>제목</option>
		            <option  class="dropdown-title"  value="3"<%if(searchType==3){%>selected<%}%>>내용</option>
		         </select>
		         <input type="text" name="_searchValue" id="_searchValue" value="<%=searchValue%>" class="form-control mx-1" maxlength="20" style="width:auto;ime-mode:active;" placeholder="무엇을 찾을까요?" />
		         <button type="button" id="btnSearch" class="button-del">조회</button>
        	 </div>
         <form name="bForm" id="bForm" method="post">
         	<input type="hidden" name="boardN" value=""/>
         	<input type="hidden" name="searchType" value="<%=searchType%>"/>
         	<input type="hidden" name="searchValue" value="<%=searchValue%>"/>
         	<input type="hidden" name="curPage" value="<%=curPage%>"/>
         </form>
				<table class="profile-username font-kyobohand" >
					<thead>
						<th scope="col" class="text-center" style="width:10%">번호</th>
						<th scope="col" class="text-center" style="width:60%">제목</th>
						<th scope="col" class="text-center" style="width:20%">작성자</th>
						<th scope="col" class="text-center" style="width:10%">조회수</th>
					</thead>
				<tbody>
				<% 
				if(list != null && list.size()>=0){ 
					
					long startNum = paging.getStartNum();
					
					for(int i=0;i<list.size();i++){ 
						Board7 b7 = list.get(i); 
					%>
					 <tr style="text-align : center">
				         <td><%=startNum%></td>
				         <td><a href="javascript:void(0)" onclick="fn_view(<%=b7.getBoardN()%>)" ><%=b7.getbTitle()%></a></td>
				         <td><%=b7.getuNickName() %></td>
				         <td><%=StringUtil.toNumberFormat(b7.getBoardReadCnt())%></td>
    				 </tr>
				<%
						startNum--;
					}
				} 
				
				else {%>
					</tbody>
					<tfoot>
     				 <tr>
            			<td colspan="5" style="text-align : center"> 조회된 데이터가 존재하지 않습니다.</td>
			        </tr>
			      </tfoot>
					
				<%}%>
				</table>
		  <nav>
<%if(paging != null){ 
	if(paging.getPrevBlockPage() > 0){ %>
	
	   <a class="page-link" href="javascript:void(0)" onclick="fn_list(<%=paging.getPrevBlockPage()%>)">이전블럭</a>
	
	<%} 
	
	for(long i = paging.getStartPage();i<=paging.getEndPage();i++){ 
		
		if(paging.getCurPage() != i){%>
		
		<a class="page-link" href="javascript:void(0)" onclick="fn_list(<%=i%>)"><%=i%></a>
		<%}
		
		else{
			%>
		 <a class="page-link" href="javascript:void(0)" style="cursor:default;"><%=i%></a>
			<%
		}
	}
	if(paging.getNextBlockPage()>0){%>
	<a class="page-link" href="javascript:void(0)" onclick="fn_list(<%=paging.getNextBlockPage()%>)">다음블럭</a>
<%	}
} %>
		  </nav>
		    <div class="profile-dropdown">
		  		<button id="writeBtn" name="writeBtn" class="button-del">글쓰기</button>
		  	</div>
          </div>
          </div>
		  <div class="menu-container">
            <%@ include file ="/include/navigation7.jsp" %>
          </div>
			
        </div>
      </div>
    </div>
  </body>
</html>

게시판 누르면 보이는 페이지다. 리스트 페이지이고, 조회 항목은 닉네임, 제목, 내용이다. 

조회수는 한 번 누르면 올라간다.

<%@page import="com.sist.web.model7.BoardFileConfig7"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8"%>
<%@ page import = "org.apache.logging.log4j.LogManager" %>   
<%@ page import = "java.util.List" %>
<%@ page import = "org.apache.logging.log4j.Logger" %>
<%@ page import = "com.sist.web.util.HttpUtil" %>
<%@ page import = "com.sist.web.dao7.BoardDao7" %>
<%@ page import = "com.sist.web.model7.Board7" %>
<%@ page import = "com.sist.web.model7.Paging7" %>
<%@ page import = "com.sist.web.model.BoardFileConfig" %>
<%@ page import = "com.sist.common.util.StringUtil" %>



<%
	Logger logger = LogManager.getLogger("/board/boardList.jsp");
	HttpUtil.requestLogString(request, logger);
	
	int searchType= HttpUtil.get(request, "searchType",0);
	String searchValue=HttpUtil.get(request,"searchValue","");
	long curPage = HttpUtil.get(request, "curPage", (long)1);
	long totalCnt = 0;
	List<Board7> list = null;
	Paging7 paging = null;
	int secret = HttpUtil.get(request, "secret",0);
	
	BoardDao7 boardDao = new BoardDao7();
	Board7 board = new Board7();
	
	if(!StringUtil.isEmpty(searchType) && !StringUtil.isEmpty(searchValue)){
		if(searchType == 1){
			board.setuNickName(searchValue);
		}
		if(searchType == 2){
			board.setbTitle(searchValue);
		}
		if(searchType == 3){
			board.setbContent(searchValue);
		}
	}
	
	totalCnt = boardDao.boardTotalCnt(board); 
	logger.debug("총 게시물 수 : "+ totalCnt);
	
	if(totalCnt > 0){
		
		paging = new Paging7(totalCnt, 
				BoardFileConfig7.LCNT,BoardFileConfig7.PCNT,curPage);

		board.setStartRow(paging.getStartRow());
		board.setEndRow(paging.getEndRow());
		
		list = boardDao.BoardList(board);
		
	}
	
	
	
%>
<!DOCTYPE html>
<html>
<head>
<%@ include file="/include/head7.jsp" %>
<meta charset="UTF-8">
<title></title>
<script>
$(document).ready(function(){
	<%if(secret==1){%>
		alert("비밀글은 작성자만 열람 가능합니다!");
  		<% secret = 0;
	}%>
	$("#_searchType").change(function(){
		$("#_searchValue").val("");
	});
	
	$("#btnSearch").on("click",function(){
		if($("#_searchValue").val() == ""){
			alert("조회할 내용을 입력해 주세요.");
			$("_searchValue").focus();
			return;
		}
		document.bForm.boardN.value="";
		document.bForm.searchType.value = $("#_searchType").val();
		document.bForm.searchValue.value= $("#_searchValue").val();
		document.bForm.curPage.value="";
		document.bForm.action="/board/boardList.jsp";
		document.bForm.submit();
	});
	
	$("#writeBtn").on("click",function(){
		document.location.href="/board/write7.jsp";
	});
	
});

function fn_list(curPage){
	document.bForm.boardN.value="";
	document.bForm.curPage.value=curPage;
	document.bForm.action = "/board/boardList.jsp";
	document.bForm.submit();
}
function fn_view(boardN){
	document.bForm.boardN.value=boardN;
	document.bForm.action="/board/boardView7.jsp";
	document.bForm.submit();
}
</script>
</head>
 <link rel="stylesheet" href="/resources/css/Cy-home.css" />
<body>
    <div class="bookcover">
      <div class="bookdot">
        <div class="page">
          <div class="profile-container">
            <div class="header profile-title font-neo">
              TODAY<span class="color-red"> 28</span> | TOTAL 234918
            </div>
            <div class="box profile-box">
              <div class="profile-image">
                <img
                  class="profile-image-img"
                  src="/resources/images/profile2.jpg"
                  alt="프로필 이미지 수정"
                />
              </div>
              <div class="profile-text font-kyobohand">
                ㄴr는.. 오늘도.. 눈물을.. 흘린ㄷr..★
              </div>
              <div class="profile-text font-kyobohand">
                <span style="color: #0f1b5c">사용자</span> (♪♬)
              </div>
              <div class="profile-dropdown">
                <div class="dropdown-button">
                  <div class="dropdown-title">파도타기</div>
                  <div class="triangle-down"></div>
                </div>
                <div class="dropdown-content">
                  <a href="#" target="_blank">블로그 바로가기</a>
                  <a href="#" target="_blank">페이스북 바로가기</a>
                  <a href="#" target="_blank">인스타그램 바로가기</a>
                </div>
              </div>
            </div>
          </div>
          
          
          <div class="content-container">
            <div class="header content-title">
              <div class="profile-text font-kyobohand">사용자의 추억 상ㅈr... (*ˊᵕˋo💐o</div>
               
              
            </div>
            
            
            <div class="box content-box">
            <div class="profile-dropdown">
		         <select name="_searchType" id="_searchType" style="width:auto;">
		            <option value="" class="dropdown-title">조회 항목</option>
		            <option  class="dropdown-title"  value="1"<%if(searchType==1){ %>selected<%}%>>닉네임</option>
		            <option  class="dropdown-title"  value="2"<%if(searchType==2){ %>selected<%} %>>제목</option>
		            <option  class="dropdown-title"  value="3"<%if(searchType==3){%>selected<%}%>>내용</option>
		         </select>
		         <input type="text" name="_searchValue" id="_searchValue" value="<%=searchValue%>" class="form-control mx-1" maxlength="20" style="width:auto;ime-mode:active;" placeholder="무엇을 찾을까요?" />
		         <button type="button" id="btnSearch" class="button-del">조회</button>
        	 </div>
         <form name="bForm" id="bForm" method="post">
         	<input type="hidden" name="boardN" value=""/>
         	<input type="hidden" name="searchType" value="<%=searchType%>"/>
         	<input type="hidden" name="searchValue" value="<%=searchValue%>"/>
         	<input type="hidden" name="curPage" value="<%=curPage%>"/>
         </form>
				<table class="profile-username font-kyobohand" >
					<thead>
						<th scope="col" class="text-center" style="width:10%">번호</th>
						<th scope="col" class="text-center" style="width:60%">제목</th>
						<th scope="col" class="text-center" style="width:20%">작성자</th>
						<th scope="col" class="text-center" style="width:10%">조회수</th>
					</thead>
				<tbody>
				<% 
				if(list != null && list.size()>=0){ 
					
					long startNum = paging.getStartNum();
					
					for(int i=0;i<list.size();i++){ 
						Board7 b7 = list.get(i); 
					%>
					 <tr style="text-align : center">
				         <td><%=startNum%></td>
				         <td><a href="javascript:void(0)" onclick="fn_view(<%=b7.getBoardN()%>)" ><%=b7.getbTitle()%></a></td>
				         <td><%=b7.getuNickName() %></td>
				         <td><%=StringUtil.toNumberFormat(b7.getBoardReadCnt())%></td>
    				 </tr>
				<%
						startNum--;
					}
				} 
				
				else {%>
					</tbody>
					<tfoot>
     				 <tr>
            			<td colspan="5" style="text-align : center"> 조회된 데이터가 존재하지 않습니다.</td>
			        </tr>
			      </tfoot>
					
				<%}%>
				</table>
		  <nav>
<%if(paging != null){ 
	if(paging.getPrevBlockPage() > 0){ %>
	
	   <a class="page-link" href="javascript:void(0)" onclick="fn_list(<%=paging.getPrevBlockPage()%>)">이전블럭</a>
	
	<%} 
	
	for(long i = paging.getStartPage();i<=paging.getEndPage();i++){ 
		
		if(paging.getCurPage() != i){%>
		
		<a class="page-link" href="javascript:void(0)" onclick="fn_list(<%=i%>)"><%=i%></a>
		<%}
		
		else{
			%>
		 <a class="page-link" href="javascript:void(0)" style="cursor:default;"><%=i%></a>
			<%
		}
	}
	if(paging.getNextBlockPage()>0){%>
	<a class="page-link" href="javascript:void(0)" onclick="fn_list(<%=paging.getNextBlockPage()%>)">다음블럭</a>
<%	}
} %>
		  </nav>
		    <div class="profile-dropdown">
		  		<button id="writeBtn" name="writeBtn" class="button-del">글쓰기</button>
		  	</div>
          </div>
          </div>
		  <div class="menu-container">
            <%@ include file ="/include/navigation7.jsp" %>
          </div>
			
        </div>
      </div>
    </div>
  </body>
</html>

글 제목을 누르면 상세페이지로 들어간다. 자신이 쓴 글이면 (쿠키와 글 정보의 아이디가 동일하면) 삭제와 수정 버튼이 뜬다. 제대로 기능한다. 

글 길이가 길어지면 갑자기 저 네비게이션 버튼이 아래로 내려가는데... 

css 정말... ㅋㅋ 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import = "org.apache.logging.log4j.LogManager" %>   
<%@ page import = "org.apache.logging.log4j.Logger" %>
<%@ page import = "com.sist.web.util.HttpUtil" %>
<%@ page import = "com.sist.web.dao7.BoardDao7" %>
<%@ page import = "com.sist.web.model7.Board7" %>
<%@ page import = "com.sist.web.model7.Paging7" %>
<%@ page import = "com.sist.web.model7.BoardFileConfig7" %>
<%@ page import = "com.sist.common.util.StringUtil" %>
<%@ page import = "com.sist.web.util.CookieUtil" %>
<%@ include file = "/include/head7.jsp" %>

<%
	Logger logger = LogManager.getLogger("/board/boardView7.jsp");
	HttpUtil.requestLogString(request, logger);
	
	String cookieId = CookieUtil.getValue(request, "U_ID");
	
	long boardN = HttpUtil.get(request, "boardN", (long)0);
	int searchType = HttpUtil.get(request, "searchType", 0);
	String searchValue = HttpUtil.get(request, "searchValue","");
	long curPage = HttpUtil.get(request, "curPage", (long)1);
	
	BoardDao7 boardDao = new BoardDao7();
	Board7 board = boardDao.boardSelect(boardN);
	
	
	if(board != null){
		boardDao.boardReadCnt(boardN);
	}
	
%>

<!DOCTYPE html>
<html lang="ko">
  <head>
    <meta charset="UTF-8" />
    <title>2021 MINI HOMEPAGE</title>
   
    <script src="https://kit.fontawesome.com/ab54b9d48d.js"></script>
    <script>
    $(document).ready(function(){
      <%if(board == null){%>
    	alert("존재하지 않는 게시물입니다.");
    	document.bFrom.action ="/board/boardList.jsp";
		document.bForm.submit(); 
<%		}
        else if(!StringUtil.equals(board.getbPrivate(), "Y")){
			if(!StringUtil.equals(board.getuId(), cookieId)){%>
				document.bForm.secret.value=1;
				document.bForm.action = "/board/boardList.jsp";
				document.bForm.submit();
<%			} // 만약에 비밀글인데 글쓴사람과 조회인(쿠키)이 다를 경우. 리스트로 보내기.
		}
		else if(board != null) {%>
			$("#listBtn").on("click",function(){
				document.bForm.action = "/board/boardList.jsp";
				document.bForm.submit();
			});
		<%if(StringUtil.equals(board.getuId(), cookieId)){%>
			$("#modiBtn").on("click",function(){
				alert("?");
				document.bForm.action = "/board/bUpdate7.jsp";
				document.bForm.submit();
			});
			$("#delBtn").on("click",function(){
				if(confirm("게시물을 삭제하시겠습니까?")){
					document.bForm.action="/board/delete7.jsp";
					document.bForm.submit();
				}
			});
		<%}
		}%>
    });
    
    </script>
  </head>
  <body>
  
    <div class="bookcover">
      <div class="bookdot">
        <div class="page">
          <div class="profile-container">
            <div class="header profile-title font-neo">
              TODAY<span class="color-red"> 28</span> | TOTAL 234918
            </div>
            <div class="box profile-box">
              <div class="profile-image">
                <img
                  class="profile-image-img"
                  src="/resources/images/profile2.jpg"
                  alt="프로필 이미지"
                />
              </div>
              <div class="profile-text font-kyobohand">
                ㄴr는.. 오늘도.. 눈물을.. 흘린ㄷr..★
              </div>
              <div class="profile-text font-kyobohand">
                <span style="color: #0f1b5c">사용자</span> (♪♬)
              </div>
              <div class="profile-dropdown">
                <div class="dropdown-button">
                  <div class="dropdown-title">파도타기</div>
                  <div class="triangle-down"></div>
                </div>
                <div class="dropdown-content">
                  <a href="#" target="_blank">블로그 바로가기</a>
                  <a href="#" target="_blank">페이스북 바로가기</a>
                  <a href="#" target="_blank">인스타그램 바로가기</a>
                </div>
              </div>
            </div>
          </div>
          <div class="content-container">
            <div class="header content-title">
                <div class="profile-text font-kyobohand">사용자의 추억 상ㅈr... (*ˊᵕˋo💐o</div>
                <div class="content-title-url">https://url주소/나중에입력</div>
            </div>
            <div class="box content-box">
                <div>
                    <div class="diary-date"><div class="guestbook-title"><%=board.getbTitle()%></div>
                    <br/><%=board.getuNickName()%></div>                 
                </div>
                <div class="diary-scrollbox">
                
                    <div class="diary">
                        <div class="diary-date"><%=board.getRegDate()%></div>
                        
                        <div class="diary-contents">
                            <p><%=board.getbContent()%></p>
                        </div>
                    </div>
                    
                    
                    <div class="secret-diary"><button id="listBtn" name="listBtn"><i class="fas fa-lock"></i>리스트로 돌아가기</button>
                    <%if(StringUtil.equals(board.getuId(), cookieId)){ %>
                    <button id="modiBtn" name="modiBtn"><i class="fas fa-lock"></i>수정</button>
                    <button id="delBtn" name="delBtn"><i class="fas fa-lock"></i>삭제</button></div>
                	<%} %>
                	<form id="bForm" name="bForm" method="post">
                		<input type="hidden" id="searchType" name="searchType" value="<%=searchType%>"/>
                		<input type="hidden" id="searchValue" name="searchValue" value="<%=searchValue%>"/>
                		<input type="hidden" id="curPage" name="curPage" value="<%=curPage%>" />
                		<input type="hidden" id="boardN" name="boardN" value="<%=board.getBoardN() %>" />
                		<input type="hidden" id="secret" name="secret" value=""/>
                	</form>
                </div>
            </div>
        </div>

          <div class="menu-container">
            <%@ include file ="/include/navigation7.jsp" %>
          </div>
        </div>
      </div>
    </div>
  </body>
</html>

글쓰기 페이지다. 

admin 계정이라면 다이어리 카테고리와 게시판 카테고리를 고를 수 있고, 비밀글도 할 수 있다. 다른 계정은 게시글만 쓸 수 있다. 리스트를 누르면 리스트 페이지로 돌아간다. 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import = "org.apache.logging.log4j.LogManager" %>
<%@ page import = "org.apache.logging.log4j.Logger" %>
<%@ page import = "com.sist.web.util.HttpUtil" %>
<%@ page import = "com.sist.web.util.CookieUtil" %>
<%@ page import = "com.sist.web.dao7.UserDao7" %>
<%@ page import = "com.sist.web.model7.User7" %>
<%@ page import = "com.sist.common.util.StringUtil" %>    
<%
Logger logger = LogManager.getLogger("[/board/write2.jsp]");

String cookieId = CookieUtil.getValue(request, "U_ID");
int searchType = HttpUtil.get(request, "searchType", 0);
String searchValue = HttpUtil.get(request, "searchValue", "");
long curPage = HttpUtil.get(request, "curPage", (long)1);

UserDao7 userDao = new UserDao7();
User7 user = userDao.userSelect(cookieId);
%>
<!DOCTYPE html>
<html>
<head>
  <head>
    <meta charset="UTF-8" />
    <title>2024 MINI HOMEPAGE</title>
    <%@ include file="/include/head7.jsp" %>
<script>
$(document).ready(function(){
	$("#bTitle").focus();
	$("#btnList").on("click",function(){
		document.bForm.action ="/board/boardList.jsp";
		document.bForm.submit();
	});
	$("#btnWrite").on("click",function(){
		if($("#bTitle").val().length <= 0){
			alert("제목은 필수 입력 사항입니다.");
			$("#bTitle").focus();
			return;
		}	
		if($("#bContent").val().length <= 0){
			alert("내용은 필수 업력 사항입니다.");
			$("#bContent").focus();
			return;
		}
		document.writeForm.submit();
	});
});
</script>
    <link rel="stylesheet" href="/resources/css/toble.css"/>
    <style>
    </style>
  </head>
  <body>
    <div class="bookcover">
      <div class="bookdot">
        <div class="page">
          <div class="profile-container">
            <div class="header profile-title font-neo">
              TODAY<span class="color-red"> 28</span> | TOTAL 234918
            </div>
            <div class="box profile-box">
              <div class="profile-image">
                <img
                  class="profile-image-img"
                  src="/resources/images/profile2.jpg"
                  alt="프로필 이미지"/>
              </div>
              <div class="profile-text font-kyobohand">
                ㄴr는.. 오늘도.. 눈물을.. 흘린ㄷr..★
              </div>
              <div class="profile-username font-kyobohand">
                <span style="color: #0f1b5c">사용자</span> (♪♬)
              </div>
              <div class="profile-dropdown">
                <div class="dropdown-button">
                  <div class="dropdown-title">파도타기</div>
                  <div class="triangle-down"></div>
                </div>
                <div class="dropdown-content">
                  <a href="#" target="_blank">블로그 바로가기</a>
                  <a href="#" target="_blank">페이스북 바로가기</a>
                  <a href="#" target="_blank">인스타그램 바로가기</a>
                </div>
              </div>
            </div>
          </div>
          <div class="content-container">
            <div class="header content-title">
                <div class="content-title-name">사용자의 추억 상ㅈr... (*ˊᵕˋo💐o</div>
                <div class="content-title-url">https://url주소/나중에입력</div>
            </div>
            <div class="box content-box">
                <div class="guestbook-scrollbox">
                    <div class="guestbook-box">
	                        <div class="guestbook-contents">
	                        	<div class="guestbook-text">
	                        	<div class="guestbook-title"><h2>게시물 쓰기</h2></div>
	                            <div class="content-container">
	                            <div class="diary-contents">
                            	<div class="profile-username font-kyobohand">	
   <!-- 글쓰기 폼 -->                       				
   <form name="writeForm" id="writeForm" action="/board/writeProc7.jsp" method="post">
      <br/>
      <input type="text" name=uNickName id="uNickName" maxlength="20" value="<%=user.getuNickName()%>" style="ime-mode:active;" class="form-control mt-4 mb-2" placeholder="이름을 입력해주세요." readonly />
      <br/>
      <input type="text" name="uId" id="uId" maxlength="30" value="<%=user.getuId()%>" style="ime-mode:inactive;" class="form-control mb-2" placeholder="이메일을 입력해주세요." readonly />
      <br/>
      <select name="writeCate" id="writeCate" class="form-control mt-4 mb-2">
      	<option value="" class="dropdown-title">카테고리</option>
		<option  class="dropdown-title"  value="1">게시판</option>
<%if(StringUtil.equals(cookieId, "test")){%>
		<option  class="dropdown-title"  value="2">다이어리</option>
<%}%>
      </select>
	  <input type="checkbox" class="model-5" id="bPrivate" name="bPrivate" value="N"/>비밀글?<br/>
      <input type="text" name="bTitle" id="bTitle" maxlength="100" style="ime-mode:active;" class="form-control mb-2" placeholder="제목을 입력해주세요." required />
      <br/>
      <textarea class="form-control" rows="10" name="bContent" id="bContent" style="ime-mode:active;" placeholder="내용을 입력해주세요" required></textarea>
      <div class="col-sm-12">
         <button type="button" id="btnWrite" class="diary-date" title="저장">저장</button>
         <button type="button" id="btnList" class="diary-date" title="리스트">리스트</button>
      </div>
   </form>
   <!-- 리스트로 돌아가기 폼 -->
   <form id="bForm" name="bForm">
   		<input type="hidden" id="searchType" name="searchType" value="<%=searchType%>"/>
        <input type="hidden" id="searchValue" name="searchValue" value="<%=searchValue%>"/>
        <input type="hidden" id="curPage" name="curPage" value="<%=curPage%>" />
   </form>
  								</div>
  								</div>
	                            </div>	
	                            </div>
	                        </div>         
                    </div>
                </div>  
            </div>
        </div>
          <div class="menu-container">
            <%@ include file ="/include/navigation7.jsp" %>
          </div>
         </div>
        </div>
      </div>
  </body>
</html>

위는 write 페이지고 아래는 위 폼을 보내서 처리하는 proc 페이지다. 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import = "org.apache.logging.log4j.LogManager" %>
<%@ page import = "org.apache.logging.log4j.Logger" %>
<%@ page import = "com.sist.web.util.HttpUtil" %>
<%@ page import = "com.sist.web.util.CookieUtil" %>
<%@ page import = "com.sist.web.dao7.BoardDao7" %>
<%@ page import = "com.sist.web.model7.Board7" %>
<%@ page import = "com.sist.web.model7.Diary7" %>
<%@ page import = "com.sist.common.util.StringUtil" %>

<%
Logger logger = LogManager.getLogger("/board/writeProc7.jsp");
HttpUtil.requestLogString(request,logger);

String cookieId = CookieUtil.getValue(request, "U_ID", "");

String msg = "";
String reUrl ="";

if(!StringUtil.equals(cookieId, "")){
	String bTitle = HttpUtil.get(request, "bTitle","");
	String bContent = HttpUtil.get(request, "bContent","");
	String aFileNum = HttpUtil.get(request, "aFileNum", "");
	if(!StringUtil.equals(bTitle, "") && !StringUtil.equals(bContent, "")){
		String bPrivate = HttpUtil.get(request, "bPrivate","Y");
		int writeCate = HttpUtil.get(request, "writeCate", 0);
		if(writeCate != 0){
			BoardDao7 boardDao = new BoardDao7();
			
			if(writeCate == 1){ //게시판
				Board7 board = new Board7();
				
				board.setuId(cookieId);
				board.setbTitle(bTitle);
				board.setbContent(bContent);
				board.setbPrivate(bPrivate);
				board.setaFileNum(aFileNum);
				
				if(boardDao.boardInsert(board)>0){
					msg="게시물이 등록되었습니다.";
					reUrl="/board/boardList.jsp";
				}
				else{
					msg="게시물 등록 중 에러가 발생하였습니다.";
					reUrl="/board/write7.jsp";
				}
				
			}
			else if (writeCate == 2){ // 다이어리
				Diary7 diary = new Diary7();
				diary.setuId(cookieId);
				diary.setdTitle(bTitle);
				diary.setdContent(bContent);
				
				if(boardDao.diaryInsert(diary)>0){
					msg="새로운 다이어리가 등록되었습니다.";
					reUrl="/board/DiaryView.jsp";
				}
				else{
					msg="게시물 등록 중 에러가 발생하였습니다.";
					reUrl="/board/write7.jsp";
				}
			}
		}
		else{
			msg="카테고리는 필수 선택 사항입니다.";
			reUrl="/board/write7.jsp";
		}
	}
	else{
		msg="제목과 내용은 필수 입력 사항입니다.";
		reUrl="/board/write7.jsp";
	}
}
else{
	msg="로그인하지 않은 사용자는 게시글을 남길 수 없습니다.";
	reUrl="/";
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>WriteProc</title>
<%@ include file = "/include/head7.jsp" %>
<script>
$(document).ready(function(){
	alert("<%=msg%>");
	location.href = "<%=reUrl%>";
});
</script>
</head>
<body>

</body>
</html>

방명록 페이지다. 아래로 스크롤을 내리면 페이징 블록이 있다. 

admin 계정은 모든 방명록을 삭제할 수 있고, 나머지 사용자는 자신이 작성한 방명록만 삭제할 수 있다. 방명록은 수정이 불가하다. 게시글 없는 댓글과 비슷하다고 생각할 수 있겠다. 

 

수정 :

<%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8"%>
<%@ page import = "org.apache.logging.log4j.LogManager" %>
<%@ page import = "org.apache.logging.log4j.Logger" %>
<%@ page import = "com.sist.web.util.HttpUtil" %>
<%@ page import = "com.sist.web.util.CookieUtil" %>
<%@ page import = "com.sist.web.dao7.UserDao7" %>
<%@ page import = "com.sist.web.dao7.BoardDao7" %>
<%@ page import = "com.sist.web.model7.User7" %>
<%@ page import = "com.sist.web.model7.Board7" %>
<%@ page import = "com.sist.common.util.StringUtil" %>  
<%
Logger log = LogManager.getLogger("updateProc.jsp");
HttpUtil.requestLogString(request, log);

String cookieId = CookieUtil.getValue(request, "USER_ID");
boolean bSuccess = false;
String eMsg = "";

long boardN = HttpUtil.get(request,"boardN",(long)0);
String searchType = HttpUtil.get(request,"searchType","");
String searchValue =HttpUtil.get(request,"searchValue","");
long curPage = HttpUtil.get(request, "curPage", (long)1);

String bTitle = HttpUtil.get(request,"bTitle","");
String bContent = HttpUtil.get(request, "bContent","");

log.debug("bTitle:"+bTitle+", bContent:"+bContent+", boardN:"+boardN);

if(boardN > 0 && !StringUtil.isEmpty(bTitle) && !StringUtil.isEmpty(bContent)){
	BoardDao7 bD = new BoardDao7();
	Board7 board = bD.boardSelect(boardN);
	
	if(board !=null){ 
			board.setbTitle(bTitle);
			board.setbContent(bContent);
			board.setBoardN(boardN);
			
			if(bD.boardUpdate(board)>0){
				bSuccess = true;	
			}
			else{
				eMsg ="게시물 수정중 오류가 발생하였습니다.";	
			}
		}
	
	else{
		eMsg ="존재하지 않는 게시물입니다.";
	}
	
}
else{
	eMsg = "게시물의 데이터가 올바르지 않습니다.";
}
	
%>
<!DOCTYPE html>
<html>
<head>
<%@ include file="/include/head.jsp" %>
<script>
$(document).ready(function(){
<%if(bSuccess){%>
	//정상 처리
	alert("게시물이 수정되었습니다.");
	document.bbsForm.action ="/board/boardList.jsp";
	document.bbsForm.submit();
<%}
else{%>
	//오류 처리
	alert("<%=eMsg%>");
	location.href="/board/boardList.jsp";
<%}%>
});
</script>
</head>
<body>
	<form name = "bForm" id="bForm" method="post">
	<input type="hidden" name="boardN" value="<%=boardN%>"/>
	<input type="hidden" name="searchType" value="<%=searchType%>"/>
	<input type="hidden" name="searchValue" value="<%=searchValue%>"/>
	<input type="hidden" name="curPage" value="<%=curPage%>"/>
	</form>
</body>
</html>

삭제:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import = "org.apache.logging.log4j.LogManager" %>   
<%@ page import = "org.apache.logging.log4j.Logger" %>
<%@ page import = "com.sist.web.util.HttpUtil" %>
<%@ page import = "com.sist.web.dao7.BoardDao7" %>
<%@ page import = "com.sist.web.model7.Board7" %>
<%@ page import = "com.sist.web.model7.GuestBook" %>
<%@ page import = "com.sist.common.util.StringUtil" %>
<%@ page import = "com.sist.web.util.CookieUtil" %>

<%
Logger logger = LogManager.getLogger("/board/delete.jsp");
HttpUtil.requestLogString(request, logger);

String cookieId = CookieUtil.getValue(request, "U_ID");

//boolean execuResult = false;
String msg ="";
String backUrl = "/board/boardList.jsp";

long boardN = HttpUtil.get(request, "boardN", (long)0);
long guestN = HttpUtil.get(request, "guestN", (long)0);

logger.debug("33333333333333333333333333 guestN:"+guestN);
BoardDao7 boardDao = new BoardDao7();
if(boardN > 0 && guestN==0){
	
	Board7 board = boardDao.boardSelect(boardN);
	if(board != null){
		if(StringUtil.equals(board.getuId(), cookieId)){
			if(boardDao.boardDelete(boardN)>0){
				msg = "게시물이 삭제되었습니다.";
			}
			else{
				msg ="게시물 삭제 중 오류가 발생하였습니다.";
			}
		}
		else{
			msg="게시물 삭제의 권한이 없습니다.";
		}
	}
	else{
		msg="게시물이 존재하지 않습니다.";
	}
}
else if (boardN <= 0 && guestN ==0){
	msg ="존재하지 않는 게시물입니다.";
}
else{//guestN != 0
	if(boardDao.guestBookDelete(guestN)>0){
		msg="방명록이 삭제되었습니다.";
		backUrl ="/board/guestBookView.jsp";
	}
	else{
		msg="방명록 삭제 중 오류가 발생하였습니다.";
		backUrl ="/board/guestBookView.jsp";
	}
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<%@ include file="/include/head7.jsp" %>
<script>
$(document).ready(function(){
	alert("<%=msg%>");
	location.href= "<%=backUrl%>";
});
</script>
</head>
<body>

</body>
</html>

로그인:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import = "org.apache.logging.log4j.LogManager" %>   
<%@ page import = "org.apache.logging.log4j.Logger" %>
<%@ page import = "com.sist.web.util.HttpUtil" %>
<%@ page import = "com.sist.web.dao7.UserDao7" %>
<%@ page import = "com.sist.web.model7.User7" %>
<%@ page import = "com.sist.common.util.StringUtil" %>
<%@ page import = "com.sist.web.util.CookieUtil" %>
<%
	Logger logger = LogManager.getLogger("loginProc7.jsp");
	HttpUtil.requestLogString(request,logger);
	
	String uId = HttpUtil.get(request, "uId");
	String uPwd = HttpUtil.get(request, "uPwd");
	String cookieId = CookieUtil.getValue(request, "U_ID");
	
	String msg = "";
	String reUrl ="";
	
	User7 user = null;
	UserDao7 userDao = new UserDao7();
	
	logger.debug("uId,uPwd,cookieId :"+uId+", "+uPwd+", "+cookieId);
	
	if(StringUtil.isEmpty(cookieId)){
		System.out.print(uId);
		if(!StringUtil.isEmpty(uId) && !StringUtil.isEmpty(uPwd)){
			
			user = userDao.userSelect(uId);

			if(user != null){
				System.out.println("uPwd, user.Pwd :"+uPwd+","+user.getuPwd());
				if(StringUtil.equals(uPwd, user.getuPwd())){
					
					
					if(StringUtil.equals(user.getuState(),"Y")){
						CookieUtil.addCookie(response, "", "U_ID", uId);
						msg="로그인 성공";
						reUrl="/board/list7.jsp";
					}
					else{
						msg="정지된 사용자입니다.";
					}
				}
				else{
					msg="비밀번호가 일치하지 않습니다.";
				}
			}
			else{
				msg="존재하지 않는 아이디입니다.";
				reUrl="/";
			}
		}
		else{
			msg="아이디나 비밀번호가 입력되지 않았습니다.";
			reUrl="/";
		}
	}
	else{
		if(!StringUtil.isEmpty(uId)){  //uId 쿠키가 있으면서 uId 내용이 있는 경우
			user = userDao.userSelect(uId);
			if(user!=null){
				if(StringUtil.equals(user.getuState(), "Y")){
					if(StringUtil.equals(cookieId, user.getuId())){
						msg="이미 로그인된 사용자입니다.";
						reUrl="/board/list7.jsp";
					}
					else{
						CookieUtil.deleteCookie(request,response,"U_ID");
						//새로운 쿠키로 로그인하고 메세지 띄워주기
					}
				}
				else{
					CookieUtil.deleteCookie(request,response,"U_ID");
					msg="정지된 사용자입니다.";
					reUrl="/";
				}
			}
			else{
				msg="사용자가 아닙니다.";
				reUrl="/";
			}
			
		}
		else{ 
			CookieUtil.deleteCookie(request,response,"U_ID");
			msg="아이디 입력이 잘못되었습니다.";
			reUrl="/";
		}
	}
	

%>
<!DOCTYPE html>
<html>
<head>
<%@ include file="/include/head.jsp" %>
</head>
<body>
<script>
$(document).ready(function(){
	alert("<%=msg%>");
	location.href ="<%=reUrl%>"
});
</script>
</body>
</html>

로그아웃:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import = "org.apache.logging.log4j.LogManager" %>   
<%@ page import = "org.apache.logging.log4j.Logger" %>
<%@ page import = "com.sist.web.util.HttpUtil" %>
<%@ page import = "com.sist.web.util.CookieUtil" %>
<%
	Logger logger = LogManager.getLogger("loginOut7.jsp");
	HttpUtil.requestLogString(request,logger);
	
	if(CookieUtil.getValue(request, "U_ID") != null){
		CookieUtil.deleteCookie(request, response, "U_ID");
	}
	
	response.sendRedirect("/index7.jsp");
%>

회원가입:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import = "org.apache.logging.log4j.LogManager" %>
<%@ page import = "org.apache.logging.log4j.Logger" %>
<!DOCTYPE html>
<head>
<%@include file="/include/head7.jsp" %>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>회원가입</title>

  <!-- Bootstrap CSS -->
  <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
    integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">

  <style>
    body {
      min-height: 100vh;

  
      background: -webkit-gradient(linear, left bottom, right top, from(#92b5db), to(#1d466c));
      
      background: -webkit-linear-gradient(bottom left, #92b5db 0%, #1d466c 100%);
      background: -moz-linear-gradient(bottom left, #92b5db 0%, #1d466c 100%);
      background: -o-linear-gradient(bottom left, #92b5db 0%, #1d466c 100%);
      background: linear-gradient(to top right, #92b5db 0%, #1d466c 100%);
      
      background-color: #a3a3a3;
  /** body에 배경이미지 적용 */
  background-image: url('https://cdn.inflearn.com/public/files/posts/38f50939-dbdc-4b1c-b4f8-72144342026f/%EB%B0%B0%EA%B2%BD.png');

 
    }

    .input-form {
      max-width: 680px;

      margin-top: 80px;
      padding: 32px;

      background: #fff;
      -webkit-border-radius: 10px;
      -moz-border-radius: 10px;
      
      border-radius: 10px;
      -webkit-box-shadow: 0 8px 20px 0 rgba(0, 0, 0, 0.15);
      -moz-box-shadow: 0 8px 20px 0 rgba(0, 0, 0, 0.15);
      box-shadow: 0 8px 20px 0 rgba(0, 0, 0, 0.15)
    }
  </style>
  <script>
  $(document).ready(function(){
	 $("#regBtn").on("click",function(){
		 var idCheck = /^[a-zA-Z0-9]{4,15}$/;
		 var spaceCheck = /\s/g;
		 var num = /^[0-9]{2,3}[0-9]{3,4}[0-9]{4}$/;
		 var emailCheck = /^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*.[a-zA-Z]{2,3}$/i;
		 
		if($.trim($("#uId").val()).length <= 0){
			alert("아이디는 필수 입력 사항입니다.");
			$("#uId").focus();
			return;
		} 
		
		if(!idCheck.test($("#uId").val()) || spaceCheck.test($("#uId").val())){
			alert("아이디는 4~12자의 공백이 없는 영문 대소문자와 숫자로만 입력이 가능합니다.");
			$("#uId").focus();
			return;
		}
		
		if($.trim($("#uNickname").val()).length <= 0){
			alert("닉네임을 입력해 주세요.");
			$("#uId").focus();
			return;
		} 
		if($.trim($("#uName").val()).length <= 0){
			alert("이름은 필수 입력 사항입니다.");
			$("#uName").focus();
			return;
		}
		if($.trim($("#uPwd1").val()).length <= 0){
			alert("비밀번호는 필수 입력 사항입니다.");
			$("#uPwd1").focus();
			return;
		} 
		if(!idCheck.test($("#uPwd1").val()) || spaceCheck.test($("#uPwd1").val())){
			alert("비밀번호는 4~12자의 공백이 없는 영문 대소문자와 숫자로만 입력이 가능합니다.");
			$("#uPwd1").focus();
			return;
		}
		
		if($("#uPwd1").val() != $("#uPwd2").val()){
			alert("비밀번호와 비밀번호 확인이 일치하지 않습니다.");
			$("#uPwd2").val("");
			$("#uPwd2").focus();
			return
		}
		
		$("#uPwd").val($("#uPwd1").val());
		
		if(!emailCheck.test($.trim($("#uEmail").val()))){
			alert("이메일을 알맞게 입력해 주세요.");
			$("#uEmail").focus();
			return;
		}
		if(!num.test($("#uPhone").val())){
			alert("휴대폰 번호는 '-' 없이 숫자로만 입력해 주세요.");
			$("#uPhone").focus();
			return;
		}
		
		
		$.ajax({
			
			type:"POST",
			url:"/user/userIdCheckAjax7.jsp", 
			data:{uId:$("#uId").val() },
			datatype:"JSON",
			success:function(obj){  
				var data = JSON.parse(obj);
				if(data.flag == 0){
					alert("가입 진행 가능");
					document.uRegForm.submit();
				}
				else if(data.flag==1){
					alert("중복된 아이디가 존재합니다.");
					$("#uId").focus();
				}
				else{
					alert("아이디 값을 확인하세요.");
					$("#uId").focus();
				}
			},
			error:function(xhr,status, error){
				alert("아이디 중복 체크 오류");
			} 
		});
	 });
  });
  </script>
</head>

<body>
  <div class="container">
    <div class="input-form-backgroud row">
      <div class="input-form col-md-12 mx-auto">
        <h4 class="mb-3">회원가입</h4>
         <form class="validation-form" name="uRegForm" id="uRegForm" method = "post" action="/user/userProc7.jsp">
          <div class="row">
            <div class="col-md-6 mb-3">
             
              <input type="text" class="form-control" id="uId" name="uId" placeholder="아이디를 입력하세요." >
            </div>
            <div class="col-md-6 mb-3">
              
              <input type="text" class="form-control" id="uNickname" name="uNickname" placeholder="닉네임">
              <div class="invalid-feedback">
              </div>
            </div>
          </div>
          <div class="mb-3">
            
            <input type="text" class="form-control" id="uName" name="uName" placeholder="이름" >
            <div class="invalid-feedback">
            </div>
          </div>
			<div class="mb-3">
            
            <input type="password" class="form-control" id="uPwd1" placeholder="비밀번호" >
            <div class="invalid-feedback">
            </div>
          </div>
          
          <div class="mb-3">
        
            <input type="password" class="form-control" id="uPwd2" placeholder="비밀번호 확인" >
            <div class="invalid-feedback">
          
            </div>
          </div>
          <div class="mb-3">
            
            <input type="email" class="form-control" id="uEmail" name="uEmail"  placeholder="you@example.com" >
            <div class="invalid-feedback">
          
            </div>
          </div>
          <div class="mb-3">
            
            <input type="text" class="form-control" id="uPhone" name="uPhone" placeholder="'-'없이 숫자로만 입력해 주세요." >
            <div class="invalid-feedback">
              
            </div>
          </div>
			<div class="mb-3">
           
            <input type="date" class="form-control" id="uBirth" name="uBirth">
            <div class="invalid-feedback">
              
            </div>
          </div>
          <div class="row">
            <div class="col-md-8 mb-3">
              
              <select class="custom-select d-block w-100" id="uGender" name="uGender">
                <option value=""></option>
                <option selected>M</option>
                <option>W</option>
              </select>
              <div class="invalid-feedback">
              </div>
            </div>
          </div>
          
          <hr class="mb-4">
          
          <div class="mb-4"></div>
          
       	  <input type="hidden" id="uPwd" name="uPwd" value=""/>
       	  <button class="btn btn-primary btn-lg btn-block" id="regBtn" name="regBtn">가입 완료</button>
        </form>
      </div>
    </div>
    <footer class="my-3 text-center text-small">
      <p class="mb-1">&copy; 2021 YD</p>
    </footer>
  </div>

</body>

</html>

에이젝스:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import = "org.apache.logging.log4j.LogManager" %>   
<%@ page import = "org.apache.logging.log4j.Logger" %>
<%@ page import = "com.sist.web.util.HttpUtil" %>
<%@ page import = "com.sist.web.dao7.UserDao7" %>
<%@ page import = "com.sist.common.util.StringUtil" %>
<%@ page import = "com.sist.web.util.CookieUtil" %>

<%
	Logger logger = LogManager.getLogger("userIdCheckAjax7.jsp");
	HttpUtil.requestLogString(request,logger);
	
	String uId = HttpUtil.get(request, "uId");
	
	logger.debug("uid:"+uId);

%>

<%
	//HTTP 로
	
	//userid 받기
	String userId = HttpUtil.get(request, "userId"); 
	
	//userId가 비어있는지 확인
	if(!StringUtil.isEmpty(uId)){
		UserDao7 userDao = new UserDao7();
		if(userDao.userIdCheckSelect(uId)<=0){
			//사용 가능(아이디 미존재)	
			logger.debug("flag:"+0);
			response.getWriter().write("{\"flag\":0}");
			
		}
		else{
			logger.debug("flag:"+1);
			//중복된 경우 (아이디가 이미 존재)
			response.getWriter().write("{\"flag\":1}");
		}
	}
	else{
		//아이디 값이 없는 경우
		response.getWriter().write("{\"flag\":-1}"); //userRegForm.jsp 에서 ajax 에서 else로 빠지게 하기 위함
	}
%>

유저다오:

package com.sist.web.dao7;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.sist.web.db.DBManager;
import com.sist.web.model7.User7;

public class UserDao7 {
	
	Logger logger = LogManager.getLogger(UserDao7.class);

	//회원가입 - 아이디 중복 체크
	public int userIdCheckSelect(String uId) {
		int result = 0;
		
		Connection conn = null;
		PreparedStatement pst = null;
		ResultSet rs = null;
		StringBuilder sql = new StringBuilder();
		
		sql.append("SELECT COUNT(*) CNT "); 
		sql.append("FROM CY_USER ");
		sql.append("WHERE U_ID = ? ");
		
		try {
			conn = DBManager.getConnection();
			pst = conn.prepareStatement(sql.toString());
			pst.setString(1, uId);
			
			rs = pst.executeQuery();
			if(rs.next()) {
				result = rs.getInt("CNT");
				System.out.println(result);
			}
			
		}
		catch(Exception e){
			logger.error("[UserDao7]userIdCheckSelect Exception");
		}
		finally {
			DBManager.close(rs, pst, conn);
		}
		return result;
	}
	
	public int userInsert(User7 user) {
		int cnt = 0;
		
		Connection conn = null;
		PreparedStatement pst = null;
		StringBuilder sql = new StringBuilder();
		
		sql.append("INSERT INTO CY_USER (U_ID, U_NAME, U_PASSWORD, U_NICKNAME, U_EMAIL, U_PHONE, U_GENDER, STATUS, REG_DATE) ");
		sql.append("VALUES (?, ?, ?, ?, ?, ?, ?, ?, SYSDATE) ");
				
		try {
			int idx = 0;
			conn = DBManager.getConnection();
			pst = conn.prepareStatement(sql.toString());
			
			pst.setString(++idx, user.getuId());
			pst.setString(++idx, user.getuName());
			pst.setString(++idx, user.getuPwd());
			pst.setString(++idx, user.getuNickName());
			pst.setString(++idx, user.getuEmail());
			pst.setString(++idx, user.getuPhone());
			pst.setString(++idx, user.getuGender());
			pst.setString(++idx, user.getuState());
			
			cnt = pst.executeUpdate();
		}
		catch(Exception e) {
			logger.debug("[UserDao7]userInsert Exception");
		}
		finally {
			DBManager.close(pst, conn);
		}
		
		return cnt;
	}
	
	//로그인
	public User7 userSelect (String uId) {
		User7 user = null;
		
		Connection conn = null;
		ResultSet rs = null;
		PreparedStatement pst = null;
		StringBuilder sql = new StringBuilder();
			
		sql.append("SELECT U_ID, U_NAME, NVL(U_PASSWORD,'') U_PASSWORD, NVL(U_NICKNAME,'') U_NICKNAME, NVL(U_EMAIL,'') U_EMAIL, ");
		sql.append("  NVL(U_PHONE,'') U_PHONE, NVL(U_GENDER,'') U_GENDER, STATUS, TO_CHAR(REG_DATE,'YYYY.DD.MM') REG_DATE ");
		sql.append(" FROM CY_USER ");
		sql.append(" WHERE U_ID = ? ");
		
		try {
			conn=DBManager.getConnection();
			pst=conn.prepareStatement(sql.toString());
			pst.setString(1, uId);
			rs = pst.executeQuery();
			
			if(rs.next()) { 
				user = new User7();
				user.setuId(rs.getString("U_ID")); 
				user.setuPwd(rs.getString("U_PASSWORD"));
				user.setuNickName(rs.getString("U_NICKNAME"));
				user.setuEmail(rs.getString("U_EMAIL"));
				user.setuPhone(rs.getString("U_PHONE"));
				user.setuState(rs.getString("STATUS"));
				user.setuGender(rs.getString("U_GENDER"));
				user.setuRegDate(rs.getString("REG_DATE"));	
				user.setuName(rs.getString("U_NAME"));
			}
			logger.debug("user.setuPwd : "+user.getuPwd());
			logger.debug("user.setuState : "+user.getuState());
		}
		catch(Exception e) {
			logger.error("[UserDao7].userSelect Exception", e);
		}
		finally {
			DBManager.close(rs, pst, conn);
		}
		return user;
	}
	//회원정보수정
	public int userUpdate(User7 user) {
		//logger.debug("업데이트 시작");
		
		int cnt = 0;
		
		Connection conn = null;
		PreparedStatement pst = null;
		StringBuilder sql = new StringBuilder();
		
		sql.append("UPDATE CY_USER  ");
		sql.append("SET U_PASSWORD = ?, ");
		sql.append("	U_NICKNAME = ?, ");
		sql.append("    U_EMAIL= ? , ");
		sql.append("    U_PHONE= ?, ");
		sql.append("    U_GENDER= ? ");
		sql.append("WHERE U_ID = ? ");
		
		logger.debug("try-catch문 시작: "+user.getuNickName());
		
		try {
			conn=DBManager.getConnection();
			pst=conn.prepareStatement(sql.toString());
			int idx =0;
			
			pst.setString(++idx, user.getuPwd());
			pst.setString(++idx, user.getuNickName());
			pst.setString(++idx, user.getuEmail());
			pst.setString(++idx, user.getuPhone());
			pst.setString(++idx, user.getuGender());
			pst.setString(++idx, user.getuId());
			//logger.debug("sql.toString() : " +sql.toString());
			//logger.debug("pst 실행 직전");
			cnt = pst.executeUpdate();
			//logger.debug("pst 실행 직후");
		}
		catch(Exception e) {
			
			logger.error("[userDao]userUpdate SQLException", e);
		}
		finally {
			DBManager.close(pst, conn);
		}
		return cnt;
	}
}

보드 다오:

package com.sist.web.dao7;

import java.util.ArrayList;
import java.util.List;
import com.sist.web.model7.Board7;
import com.sist.web.model7.Diary7;
import com.sist.web.model7.GuestBook;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.sist.common.util.StringUtil;
import com.sist.web.db.DBManager;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;


public class BoardDao7 {
	
	Logger logger = LogManager.getLogger("[BoardDao7.java]");
	
	//리스트 뽑기
	public List BoardList (Board7 board) {
		List<Board7> list = new ArrayList<>();
		
		Connection conn = null;
		ResultSet rs = null;
		PreparedStatement pst = null;
		StringBuilder sql = new StringBuilder();
		
		sql.append("SELECT BOARD_N, U_ID, U_NICKNAME, B_TITLE, BOARD_READ_CNT ");
		sql.append(" FROM (SELECT ROWNUM RN, BOARD_N, U_ID, U_NICKNAME, B_TITLE, BOARD_READ_CNT ");
		sql.append("         FROM (SELECT A.* ");
		sql.append("                FROM (SELECT B.BOARD_N, U.U_ID, NVL(U.U_NICKNAME,'') U_NICKNAME, NVL(B.B_TITLE,'') B_TITLE, NVL(B.BOARD_READ_CNT,0) BOARD_READ_CNT ");
		sql.append("                        FROM CY_BOARD B, CY_USER U ");
		sql.append("                       WHERE U.U_ID = B.U_ID ");
		
		if(board != null) {
			if(!StringUtil.isEmpty(board.getuNickName())) {
				sql.append("                       AND U.U_NICKNAME LIKE '%'||?||'%' ");
			}
			if(!StringUtil.isEmpty(board.getbTitle())) {
				sql.append("                       AND B.B_TITLE LIKE '%'||?||'%' ");
			}
			if(!StringUtil.isEmpty(board.getbContent())) {
				sql.append("                       AND DBMS_LOB.INSTR(B.B_CONTENT, ?) > 0 ");
			}
		}
		
		sql.append("                     ORDER BY B.REG_DATE DESC)A )C) ");
		
		if(board!=null) {
			sql.append("WHERE RN >=? ");
			sql.append(" AND RN <=? ");
		}
		try {
			conn = DBManager.getConnection();
			pst = conn.prepareStatement(sql.toString());
			int index = 0;
			
			if(board!=null) {
				if(!StringUtil.isEmpty(board.getuNickName())) {
					pst.setString(++index, board.getuNickName());
				}
				if(!StringUtil.isEmpty(board.getbTitle())) {
					pst.setString(++index, board.getbTitle());
				}
				if(!StringUtil.isEmpty(board.getbContent())) {
					pst.setString(++index, board.getbContent());
				}
				pst.setLong(++index, board.getStartRow());
				pst.setLong(++index, board.getEndRow());
			}
			rs = pst.executeQuery();
			
			while(rs.next()) {
				
				Board7 bb = new Board7();
				bb.setBoardN(rs.getLong("BOARD_N"));
				bb.setuId(rs.getString("U_ID"));
				bb.setuNickName(rs.getString("U_NICKNAME"));
				bb.setbTitle(rs.getString("B_TITLE"));
				bb.setBoardReadCnt(rs.getLong("BOARD_READ_CNT"));
				
				//logger.debug("list title : "+ bb.getbTitle());
				
				list.add(bb);
			}
		}
		catch(Exception e) {
			logger.error("[BoardDao7 boardList]", e);
		}
		finally {
			DBManager.close(rs, pst, conn);
		}
		return list;
	}
	//총 게시물 수
	
	public long boardTotalCnt (Board7 board) {
		long cnt = 0;
		
		Connection conn = null;
		PreparedStatement pst = null;
		ResultSet rs = null;
		StringBuilder sql = new StringBuilder();
		
		
		sql.append("SELECT COUNT(A.BOARD_N) AS TOTALCNT");
		sql.append("  FROM CY_BOARD A, CY_USER B ");
		sql.append(" WHERE A.U_ID = B.U_ID ");
		
		if(board!=null) {
			if(!StringUtil.isEmpty(board.getuNickName())) {
				sql.append("AND B.U_NICKNAME LIKE '%'||?||'%' ");
			}
			if(!StringUtil.isEmpty(board.getbTitle())) {
				sql.append("AND A.B_TITLE LIKE '%'||?||'%' ");
			}
			if(!StringUtil.isEmpty(board.getbContent())) {
				sql.append("AND DBMS_LOB.INSTR(A.B_CONTENT, ?) > 0 ");
			}   
		}
		try {
			conn = DBManager.getConnection();
			pst = conn.prepareStatement(sql.toString());
			int idx=0;
			
			if(board!=null) {
				if(!StringUtil.isEmpty(board.getuNickName())) {
					
					pst.setString(++idx, board.getuNickName());
				}
				if(!StringUtil.isEmpty(board.getbTitle())) {
					pst.setString(++idx, board.getbTitle());
				}
				if(!StringUtil.isEmpty(board.getbContent())) {
					pst.setString(++idx, board.getbContent());
				}
			}
			
			rs = pst.executeQuery();
			if(rs.next()) {
				cnt = rs.getLong("TOTALCNT");
			}
		}
		catch(Exception e){
			logger.error("[BoardDao7] boardTotalCnt SQL Exception",e);
		}
		finally {
			DBManager.close(rs, pst, conn);
		}
		
		
		return cnt;
	}
	
	//상세페이지용 하나뽑기
	
	public Board7 boardSelect (long boardN) {
		Board7 board = new Board7();
		
		Connection conn = null;
		PreparedStatement pst = null;
		ResultSet rs = null;
		StringBuilder sql = new StringBuilder();
		
		sql.append("SELECT B.BOARD_N, A.U_ID, A.U_NICKNAME, NVL(B.A_FILE_NUM,'') AS A_FILE_NUM, B.B_PRIVATE, ");
		sql.append("       NVL(B.B_TITLE,'') B_TITLE, NVL(B.B_CONTENT,'') B_CONTENT, B.REG_DATE, B.BOARD_READ_CNT ");
		sql.append("	  FROM CY_USER A, CY_BOARD B ");
		sql.append("	 WHERE A.U_ID = B.U_ID ");
		sql.append("	   AND B.BOARD_N = ? ");
		
		try {
			conn = DBManager.getConnection();
			pst = conn.prepareStatement(sql.toString());
			pst.setLong(1, boardN);
			rs = pst.executeQuery();
			
			if(rs.next()) {
				board.setBoardN(rs.getLong("BOARD_N"));
				board.setuId(rs.getString("U_ID"));
				board.setuNickName(rs.getString("U_NICKNAME"));
				board.setaFileNum(rs.getString("A_FILE_NUM"));
				board.setbPrivate(rs.getString("B_PRIVATE"));
				board.setbTitle(rs.getString("B_TITLE"));
				board.setbContent(rs.getString("B_CONTENT"));
				board.setRegDate(rs.getString("REG_DATE"));
				board.setBoardReadCnt(rs.getLong("BOARD_READ_CNT"));
			}
			
		}
		catch(Exception e) {
			logger.error("[BoardDao7]boardSelect SQL Exception");
		}
				return board;
	}
	//게시물 수정
	
	public int boardUpdate (Board7 board) {
		int count = 0;
		Connection conn = null;
		PreparedStatement pst = null;
		StringBuilder sql = new StringBuilder();
		
		sql.append("UPDATE CY_BOARD ");
		sql.append("   SET B_TITLE = ?, ");
		sql.append("  B_CONTENT = ? ");
		sql.append(" WHERE BOARD_N = ? ");
		
		try {
			conn = DBManager.getConnection();
			pst = conn.prepareStatement(sql.toString());
			int idx = 0;
			pst.setString(++idx, board.getbTitle());
			pst.setString(++idx, board.getbContent());
			pst.setLong(++idx, board.getBoardN());
			
			count=pst.executeUpdate();
		}
		catch(Exception e) {
			
			logger.error("[UserDao]userUpdate SQLException", e);
		}
		finally {
			DBManager.close(pst, conn);
		}
		
		return count;
	}
	//조회수 높이기
	public int boardReadCnt (long boardN) {
		int cnt = 0;
		
		Connection conn = null;
		PreparedStatement pst = null;
		StringBuilder sql = new StringBuilder();	
		
		sql.append("UPDATE CY_BOARD ");
		sql.append("   SET BOARD_READ_CNT = BOARD_READ_CNT + 1 ");
		sql.append(" WHERE BOARD_N = ? ");
		
		try {
			conn = DBManager.getConnection();
			pst = conn.prepareStatement(sql.toString());
			pst.setLong(1, boardN);
			cnt=pst.executeUpdate();
		}
		catch(Exception e) {
			logger.error("[boardDao7] boardReadCnt SQL Exception");
		}
		finally {
			DBManager.close(pst, conn);
		}
		return cnt;
	}
	//게시물 삭제
	public int boardDelete (long boardN) {
		int cnt = 0;
		
		Connection conn = null;
		PreparedStatement pst = null;
		StringBuilder sql = new StringBuilder();
		
		sql.append("DELETE FROM CY_BOARD ");
		sql.append(" WHERE BOARD_N = ? ");
		
		try {
			conn = DBManager.getConnection();
			pst = conn.prepareStatement(sql.toString());
			pst.setLong(1, boardN);
			
			cnt = pst.executeUpdate();
		}
		catch(Exception e) {
			logger.debug("[boardDao7]boardDelete SQLException");
		}
		finally {
			DBManager.close(pst, conn);
		}
		
		return cnt;
	}
	
	//게시물 등록
	public int boardInsert (Board7 board) {
		int cnt = 0;
		
		Connection conn = null;
		PreparedStatement pst = null;
		StringBuilder sql = new StringBuilder();
		
		sql.append("INSERT INTO CY_BOARD ");
		sql.append("(BOARD_N, U_ID, BOARD_READ_CNT, A_FILE_NUM, B_PRIVATE, B_TITLE, B_CONTENT, REG_DATE) ");
		sql.append(" VALUES ");
		sql.append("(?, ?, ?, ?, ?, ?, ?, SYSDATE ) ");
		
		try {
			conn = DBManager.getConnection();
			pst = conn.prepareStatement(sql.toString());
			
			int idx = 0;
			long boardN = 0;
			
			boardN = newBoardN(conn);
			
			board.setBoardN(boardN);
			
			pst.setLong(++idx, board.getBoardN());
			pst.setString(++idx, board.getuId());
			pst.setLong(++idx, 0);
			pst.setString(++idx, board.getaFileNum());
			pst.setString(++idx, board.getbPrivate());
			pst.setString(++idx, board.getbTitle());
			pst.setString(++idx, board.getbContent());
			
			cnt = pst.executeUpdate();
			
			
		}
		catch(Exception e) {
			logger.error("[boardDao7]boardInsert SQLException", e);
		}
		finally {
			DBManager.close(pst, conn);
		}
		return cnt;
	}
	//시퀀스 조회
	private long newBoardN (Connection conn) {
		long boardN = 0;
		PreparedStatement pst = null;
		StringBuilder sql = new StringBuilder();
		ResultSet rs = null;
		
		sql.append("SELECT SEQ_CY_BOARD_SEQ.NEXTVAL FROM DUAL ");
		
		try {
			pst = conn.prepareStatement(sql.toString());
			rs = pst.executeQuery();
			if(rs.next()) {
				boardN = rs.getLong(1);
			}
		}
		catch(Exception e) {
			logger.error("[BoardDao7]newBoardN SQLException");
		}
		finally {
			DBManager.close(rs, pst);
		}
		return boardN;
	}
	
	//다이어리 인서트 
	public int diaryInsert (Diary7 diary) {
		int cnt = 0;
		
		Connection conn = null;
		PreparedStatement pst = null;
		StringBuilder sql = new StringBuilder();
		
		sql.append("INSERT INTO DIARY ");
		sql.append("(D_NUM, U_ID, D_TITLE, D_CONTENT, REG_DATE) ");
		sql.append("VALUES ");
		sql.append("((SELECT NVL(MAX(D_NUM),0)+1 FROM DIARY),?,?,?,SYSDATE) ");
		
		try {
			conn = DBManager.getConnection();
			pst=conn.prepareStatement(sql.toString());
			int idx = 0;
			
			pst.setString(++idx, diary.getuId());
			pst.setString(++idx,diary.getdTitle());
			pst.setString(++idx, diary.getdContent());
			
			cnt = pst.executeUpdate();
		}
		catch(Exception e) {
			logger.error("[BoardDao] boardInsert SQLException", e);
		}
		finally {
			DBManager.close(pst, conn);
		}
		return cnt;
	}
	//다이어리 총 게시물 수
	public long diaryTotalCnt () {
		long cnt = 0;
		
		Connection conn = null;
		PreparedStatement pst = null;
		ResultSet rs = null;
		StringBuilder sql = new StringBuilder();
		
		
		sql.append("SELECT COUNT(D_NUM) AS TOTALCNT");
		sql.append("  FROM DIARY ");
		
		try {
			conn = DBManager.getConnection();
			pst = conn.prepareStatement(sql.toString());
			rs = pst.executeQuery();
			
			if(rs.next()) {
				cnt = rs.getLong("TOTALCNT");
			}
		}
		catch(Exception e){
			logger.error("[BoardDao7] diaryTotalCnt SQL Exception",e);
		}
		finally {
			DBManager.close(rs, pst, conn);
		}
		
		
		return cnt;
	}
	//다이어리 뽑아오기
	public List DiaryList (Diary7 diary) {
		
		List<Diary7> list = new ArrayList<>();
		
		Connection conn = null;
		ResultSet rs = null;
		PreparedStatement pst = null;
		StringBuilder sql = new StringBuilder();
		
		sql.append("SELECT D_NUM, D_TITLE, D_CONTENT, REG_DATE ");
		sql.append("  FROM (SELECT ROWNUM RN, D_NUM, D_TITLE, D_CONTENT, REG_DATE ");
		sql.append("		FROM (SELECT D_NUM, D_TITLE, D_CONTENT, REG_DATE ");
		sql.append("				FROM (SELECT D_NUM, D_TITLE, D_CONTENT, REG_DATE ");
		sql.append("						FROM DIARY  ");
		sql.append("					   ORDER BY REG_DATE DESC))) ");
		sql.append("WHERE RN >= ? "); 
		sql.append("  AND RN <= ? ");
		
		
		try {
			conn = DBManager.getConnection();
			pst = conn.prepareStatement(sql.toString());
			int index = 0;
			
			pst.setLong(++index, diary.getStartRow());
			pst.setLong(++index, diary.getEndRow());
			
			rs = pst.executeQuery();
			
			while(rs.next()) {
				
				Diary7 d = new Diary7();
				d.setdNum(rs.getLong("D_NUM"));
				d.setdTitle(rs.getString("D_TITLE"));
				d.setdContent(rs.getString("D_CONTENT"));
				d.setRegDate(rs.getString("REG_DATE"));
				
				
				list.add(d);
			}
		}
		catch(Exception e) {
			logger.error("[BoardDao7] DiaryList", e);
		}
		finally {
			DBManager.close(rs, pst, conn);
		}
		return list;
	}
	
	//방명록 토탈
	public long GuestBookTotalCnt () {
		long cnt = 0;
		
		Connection conn = null;
		PreparedStatement pst = null;
		ResultSet rs = null;
		StringBuilder sql = new StringBuilder();
		
		
		sql.append("SELECT COUNT(GUEST_N) AS TOTALCNT");
		sql.append("  FROM GUEST_BOOK ");
		
		try {
			conn = DBManager.getConnection();
			pst = conn.prepareStatement(sql.toString());
			rs = pst.executeQuery();
			
			if(rs.next()) {
				cnt = rs.getLong("TOTALCNT");
			}
		}
		catch(Exception e){
			logger.error("[BoardDao7] GuestTotalCnt SQL Exception",e);
		}
		finally {
			DBManager.close(rs, pst, conn);
		}
		
		
		return cnt;
	}
	
	//방명록 리스트
public List GuestBookList (GuestBook gb) {
		
		List<GuestBook> list = new ArrayList<>();
		
		Connection conn = null;
		ResultSet rs = null;
		PreparedStatement pst = null;
		StringBuilder sql = new StringBuilder();
	
		sql.append("SELECT GUEST_N, U_ID, U_NICKNAME, GUEST_CONTENT,REG_DATE FROM (SELECT ROWNUM RN, A.* ");
		sql.append("  FROM (SELECT * FROM(SELECT B.GUEST_N, U.U_ID, U.U_NICKNAME, B.GUEST_CONTENT, B.REG_DATE ");
		sql.append("						FROM GUEST_BOOK B, CY_USER U  ");
		sql.append("                       WHERE B.U_ID = U.U_ID ");
		sql.append("				                  ORDER BY REG_DATE DESC))A) ");
		sql.append("				WHERE RN>= ? ");
		sql.append("				  AND RN<= ? ");
		
		
		try {
			conn = DBManager.getConnection();
			pst = conn.prepareStatement(sql.toString());
			int index = 0;
			
			pst.setLong(++index, gb.getStartRow());
			pst.setLong(++index, gb.getEndRow());
			
			rs = pst.executeQuery();
			
			while(rs.next()) {
				
				GuestBook g = new GuestBook();
				g.setGuestN(rs.getLong("GUEST_N"));
				g.setuId(rs.getString("U_ID"));
				g.setuNickname(rs.getString("U_NICKNAME"));
				g.setgContent(rs.getString("GUEST_CONTENT"));
				g.setRegDate(rs.getString("REG_DATE"));
				
				list.add(g);
			}
		}
		catch(Exception e) {
			logger.error("[BoardDao7] GUESTList ", e);
		}
		finally {
			DBManager.close(rs, pst, conn);
		}
		return list;
	}
//방명록 인서트
public int GuestBookInsert (GuestBook guest) {
	int cnt = 0;
	
	Connection conn = null;
	PreparedStatement pst = null;
	StringBuilder sql = new StringBuilder();
	
	sql.append("INSERT INTO GUEST_BOOK ");
	sql.append("(GUEST_N, U_ID, GUEST_CONTENT, REG_DATE) ");
	sql.append("VALUES ");
	sql.append("((SELECT NVL(MAX(GUEST_N),0)+1 FROM GUEST_BOOK),?,?,SYSDATE) ");
	
	try {
		conn = DBManager.getConnection();
		pst=conn.prepareStatement(sql.toString());
		int idx = 0;
		
		pst.setString(++idx, guest.getuId());
		pst.setString(++idx, guest.getgContent());
		
		cnt = pst.executeUpdate();
	}
	catch(Exception e) {
		logger.error("[BoardDao] boardInsert SQLException", e);
	}
	finally {
		DBManager.close(pst, conn);
	}
	return cnt;
}
//방명록 업데이트(삭제)
public int guestBookDelete (long guestN) {
	int cnt = 0;
	
	Connection conn = null;
	PreparedStatement pst = null;
	StringBuilder sql = new StringBuilder();
	
	sql.append("DELETE FROM GUEST_BOOK ");
	sql.append(" WHERE GUEST_N = ? ");
	
	try {
		conn = DBManager.getConnection();
		pst = conn.prepareStatement(sql.toString());
		pst.setLong(1, guestN);
		
		cnt = pst.executeUpdate();
	}
	catch(Exception e) {
		logger.debug("[boardDao7]guestBookDelete SQLException");
	}
	finally {
		DBManager.close(pst, conn);
	}
	
	return cnt;
}
}

 

 

css 는 말할 것도 없지만, 아... 자바스크립트는 정말 어렵다... 차라리 자바가 낫다는게 뭔지 알겠다... 오류가 나도 뭐가 문젠지 알 수가 없다. 연습이 필요할듯. 

시간이 더 있다면 ajax 활용해서 좋아요 구현하고 싶었다. 그리고 투데이 기능도 하고 싶었는데 아쉽다. 

다른 팀 발표를 보니 아이디/비밀번호 찾기/ 지도 api 가져오기 등 색다른게 많아서 다음 프로젝트는 댓글 포함 좀 더 적극적으로 계획해보려고 한다. 끝.

 

 

최종 시연 영상:

 

 

 

 

 

 

 

 

html 템플릿 소스는 다음 링크 블로그 주인분께 허락을 받고 가져왓다. 

감사합니닷...

https://sujin-dev.tistory.com/378#comment19479024

 

[ Visual Studio Code ] 싸이월드 페이지 만들기 - ②

TODAY 28 | TOTAL 123456 수지니의 추억상ㅈr..(*ˊᵕˋo💐ohttps://cafe.naver.com/codeuniv body { background-color: #a3a3a3; /** body에 배경이미지 적용 */ background-image: url("../static/images/pattern.png"); /** 고정된 사이즈로 설

sujin-dev.tistory.com