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

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

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

    처음에는 몰랐는데 마지막에 아쉬웠던 점은 괜히 테이블을 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

     

    댓글