20240222 스프링(요구사항 확인-읽음 수 올리기,파일업로드, 디비 암호화)

2024. 2. 22. 12:502023.11.21-2024.05.31

BoardService.java > detail 수정

	// 2024.02.16
	public BoardDTO detail(int no) { // 파라미터에 따라 아래 값이 달라지니까 보드컨트롤러에서 reNo를 써도 여기서 no로 쓰면 된다.
		// 문자? util에 숫자로 변경해주는 메소드 만들기
		//2024.02.22 psd 요구사항 확인
		//로그인 했어?-? 읽음 수 올리기
		if(util.getSession().getAttribute("mid") != null) {
			//DTO 객체 만들기 = 번호 +아이디
			BoardDTO dto = new BoardDTO;
			dto.setBoard_no(no);
			dto.setMid((String) util.getSession().getAttribute("mid"));
			boardDAO.countUP(dto);
		}
		
		return boardDAO.detail(no);
	}

 

BoardDAO>countUP 만들어주기. 리턴은 없음

	public void countUP(BoardDTO dto) {
		//리턴 없음
		sqlSession.insert("board.countUP", dto);
		
	}

 

board-mapper.xml

	<!-- 2024.02.22 -->
	<insert id= "countUP" parameterType="boardDTO">
		FROM visitcount (board_no, mno)
		VALUES (#{board_no}, (SELECT mno FROM member WHERE mid=#{mid}))
	</insert

 

 

>이렇게 했을때 1개 ID로 들어가는대로 다 체크 되서 다시 만들기로함

 

 

 

한개의 ID당 1번만 조회되도록 체크

BoardService> alreadyRead 추가

	// 2024.02.16
	public BoardDTO detail(int no) { // 파라미터에 따라 아래 값이 달라지니까 보드컨트롤러에서 reNo를 써도 여기서 no로 쓰면 된다.
		// 문자? util에 숫자로 변경해주는 메소드 만들기
		//2024.02.22 psd 요구사항 확인
		//2022.02.22 로그인 했어?-? 읽음 수 올리기 
		if(util.getSession().getAttribute("mid") != null) {
			//DTO 객체 만들기 = 번호 +아이디
			BoardDTO dto = new BoardDTO();
			dto.setBoard_no(no);
			dto.setMid((String) util.getSession().getAttribute("mid"));
			int result = boardDAO.alredyRead(dto);
			if(result == 0) {
				boardDAO.countUP(dto);
		
			}
		}
		
		return boardDAO.detail(no);
	}

 

 

BoardDAO > alreadyRead 적기

//2022.02.22 읽음수 올리기
	public int alreadyRead(BoardDTO dto) {
		return sqlSession.selectOne("board.alreadyRead",dto);
	}

 

board-mapper>alreadyRead  쿼리문 적기

   <select id= "alredyRead" parameterType="boardDTO" resultType="Integer">
  		SELECT count(*)
  		FROM visitcount
  		WHERE board_no=#{board_no} AND mno=(SELECT mno FROM member WHERE mid=#{mid})
   </select>

 

이렇게 읽음 수가 올라간다.

3인 것은 alreadyRead 쓰기 전 내가 3번 들어가서 체크 된것.

아래 1개 , 1개는 alreadyRead  이후 1개씩 체크 된 것.

 

 

 

*수정했는데 왜 했는지는 모르겠고, 결과는 같다.

BoardService >detail 수정

	// 2024.02.16
	public BoardDTO detail(int no) { // 파라미터에 따라 아래 값이 달라지니까 보드컨트롤러에서 reNo를 써도 여기서 no로 쓰면 된다.
		// 문자? util에 숫자로 변경해주는 메소드 만들기
		//2024.02.22 psd 요구사항 확인
		//2022.02.22 로그인 했어?-? 읽음 수 올리기 
		if(util.getSession().getAttribute("mid") != null) {
	         // DTO 만들기 : 아이디, 비번
	         BoardDTO dto = new BoardDTO();
	         dto.setBoard_no(no);
	         dto.setMid((String) util.getSession().getAttribute("mid")); // if문으로 읽었는지 다시 물어보기
	         boardDAO.countUP(dto);
	      }
	      return boardDAO.detail(no); 
	   }

 

board-mapper.xml 수정

	   <!-- 2024-02-22 -->
   <insert id="countUP" parameterType="boardDTO">
      <selectKey keyProperty="board_count" resultType="Integer" order="BEFORE">
         SELECT count(*)
         FROM visitcount
         WHERE board_no=#{board_no} AND mno=(SELECT mno FROM member WHERE mid=#{mid})
      </selectKey>
      <if test="board_count == 0">      
         INSERT INTO visitcount (board_no, mno) 
         VALUES (#{board_no}, (SELECT mno FROM member WHERE mid=#{mid}))
      </if>
      <if test="board_count != 0">      
         SELECT count(*) FROM dual
      </if>
   </insert>
</mapper>

쿼리가 길어지고, 마이바티스가 알아서 선택하게 해준다.

 

댓글 좋아요 표시

					<!-- 2024.02.22 like,ip,time 이미지 -->
					<div class="col-2"><img alt="ip" src="./img/ip.png">${c.cip }</div>
					<div class="col-2"><img alt="time" src="./img/time.png">${c.cdate }</div>
					<div class="col-1">
					<img alt="like" src="./img/like.png" onclick="like(${c.no })">
					${c.clike }
					</div>

 

 

img >  이름에 맞게 사진 넣어주기

 

 


function like(cno) 만들어주기

//2024.02.22
function like(cno){
	Swal.fire("좋아요를 누릅니다.","","succcess");
	
}

 

 

//2024.02.22
function like(cno){
	Swal.fire("좋아요를 누릅니다.","","succcess");
	location.href="./likeUp?no=${detail.board_no}&cno="+cno;
}

 

하트를 누르면  cno로 간다.

 

 

BoardController >likeUp 만들기

// 2024-02-22 댓글 좋아요 요구사항 확인 psd
	@GetMapping("/likeUp")
	public String likeUp(@RequestParam("no") String no, @RequestParam("cno") String cno) {// board_no=no, cno=cno
		if (util.intChek(no) && util.intChek(cno)) {
			CommentDTO dto = new CommentDTO();
			dto.setBoard_no(0);
			dto.setNo(0);

			return "redirect:/detail?no=" + dto.getBoard_no();
		} else {
			return "redorect:/error";
		}
	}
}

 

유틸에 추가하기

    //숫자인지 검사하는 메소드
    public boolean intChek(String str) { 
    	try {
    		Integer.parseInt(str);
    		return true;
      	} catch(Exception e) {
      		return false;
      	}
    }
}

 

BoardService>likeUp

// 2024.02.22
	   public int likeUp(CommentDTO dto) {
			return boardDAO.liekUp(dto);
		}

 

BoardDAO>likeUp

 

//2022.02.22 댓글 좋아요 올리기
	public int liekUp(CommentDTO dto) {
		return sqlSession.update("board.likeUp", dto);
	}

 

board-mapper>likeUp

 	<update id="likeUp" parameterType="commentDTO">
		UPDATE comment SET clike = clike + 1 WHERE cno=#{no}
	</update>

 

 

menu.jsp>

./myInfo@${sessionScope.mid }"> 추가

         <div class="collapse navbar-collapse" id="navbarResponsive">
            <ul class="navbar-nav text-uppercase ms-auto py-4 py-lg-0">
               <li class="nav-item"><a class="nav-link" href="./board">게시판</a></li>
               <li class="nav-item"><a class="nav-link" href="./notice">공지사항</a></li>
               <c:choose>
                  <c:when test="${sessionScope.mid ne null }">
                     <li class="nav-item"><a class="nav-link" href="./myInfo@${sessionScope.mid }"> ${sessionScope.mname }님</a></li>
                     <li class="nav-item"><a class="nav-link" href="./logout">로그아웃</a></li>
                  </c:when>
                  <c:otherwise>
                     <li class="nav-item"><a class="nav-link" href="./login">로그인</a></li>
                  </c:otherwise>
               </c:choose>
               
            </ul>
         </div>
      </div>
   </nav>

 

 

Login Controller > 책 366~376

//	 2024.02.22 http://172.30.1.220/myInfo@mask
	 @GetMapping("/myInfo@{id}")
	 public String myInfo(@PathVariable("id") String id) {
		 System.out.println("id : " + id);
		 return "myinfo";
	 }

 

 콘솔창에  mask나오기, 주소창에도 나오기

 

 

myInfo.jsp >  로그인 복사해서 만들기

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
        <meta name="description" content="" />
        <meta name="author" content="" />
        <title>Trinity Company - My info</title>
        <!-- Favicon-->
        <link rel="icon" type="image/x-icon" href="assets/favicon.ico" />
        <link rel="shortcut icon" type="image/x-icon" href="assets/favicon.ico" />
        <link rel="apple-touch-icon" sizes="57x57" href="assets/apple-icon-57x57.png">
		<link rel="apple-touch-icon" sizes="60x60" href="assets/apple-icon-60x60.png">
		<link rel="apple-touch-icon" sizes="72x72" href="assets/apple-icon-72x72.png">
		<link rel="apple-touch-icon" sizes="76x76" href="assets/apple-icon-76x76.png">
		<link rel="apple-touch-icon" sizes="114x114" href="assets/apple-icon-114x114.png">
		<link rel="apple-touch-icon" sizes="120x120" href="assets/apple-icon-120x120.png">
		<link rel="apple-touch-icon" sizes="144x144" href="assets/apple-icon-144x144.png">
		<link rel="apple-touch-icon" sizes="152x152" href="assets/apple-icon-152x152.png">
		<link rel="apple-touch-icon" sizes="180x180" href="assets/apple-icon-180x180.png">
		<link rel="icon" type="image/png" sizes="192x192"  href="assets/android-icon-192x192.png">
		<link rel="icon" type="image/png" sizes="32x32" href="assets/favicon-32x32.png">
		<link rel="icon" type="image/png" sizes="96x96" href="assets/favicon-96x96.png">
		<link rel="icon" type="image/png" sizes="16x16" href="assets/favicon-16x16.png">
		<link rel="manifest" href="assets/manifest.json">
		<meta name="msapplication-TileColor" content="#ffffff">
		<meta name="msapplication-TileImage" content="/ms-icon-144x144.png">
		<meta name="theme-color" content="#ffffff">
        <!-- Font Awesome icons (free version)-->
        <script src="https://use.fontawesome.com/releases/v6.3.0/js/all.js" crossorigin="anonymous"></script>
        <!-- Google fonts-->
        <link href="https://fonts.googleapis.com/css?family=Montserrat:400,700" rel="stylesheet" type="text/css" />
        <link href="https://fonts.googleapis.com/css?family=Roboto+Slab:400,100,300,700" rel="stylesheet" type="text/css" />
        <!-- Core theme CSS (includes Bootstrap)-->
        <link href="css/styles.css" rel="stylesheet" />
        <script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
    </head>
    <body id="page-top">
        <!-- Navigation-->
        <%@ include file="menu.jsp" %>
        
        <!-- login-->
        <section class="page-section" id="my-info">
            <div class="d-flex justify-content-center">
               <div class="text-center">
               		<div>
               			등록한  e-mail로 인증 번호가 발송되었습니다. 
               			email을 확인 후 인증번호를 확인하세요.
               			<form action="">
               				<input type="number" name="namber">
               				<button>인증하기</button>
               			</form>
               		</div>
               		
					
            	</div>
            </div>
        </section>
        
        <!-- Bootstrap core JS-->
        <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js"></script>
        <!-- Core theme JS-->
        <script src="js/scripts.js"></script>
        <!-- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *-->
        <!-- * *                               SB Forms JS                               * *-->
        <!-- * * Activate your form at https://startbootstrap.com/solution/contact-forms * *-->
        <!-- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *-->
        <script src="https://cdn.startbootstrap.com/sb-forms-latest.js"></script>
    </body>
</html>

 

 

메일 생성하기(outlook)

이거 기억하기. 나중에 적어줘야한다.