Java/Spring Framework

[ Spring ] Ajax를 이용한 게시판 좋아요 증가, 감소

Mungwang 2023. 8. 23. 14:20

VS-Code [  jsp ] 


-  필수적으로 필요한 작업

 

 
     <%-- 누가(로그인한 회원 번호) 어떤 게시글(현재 게시글 번호) 좋아요를 클릭 / 취소
   
         로그인한 회원 번호 얻어오기
         1) ajax로 session에 있는 loginMember의 memberNo를 반환
         2) HTML 요소에 로그인한 회원의 번호를 숨겨 놓고 JS로 얻어오기
         3) JSP 파일 제일 위에있는 script 태그에 JS + EL 이용해서
            전역 변수로 선언해두기
   
    --%>
 

 

- Script

- JSP 작성 가능한 언어 / 라이브러리

-> html, css, js, java, EL, JSTL

 

 
    <script>
 
        // 게시글 번호 전역 변수로 선언

        const boardNo = "${board.boardNo}";

        // 로그인한 회원 번호를 전역 변수로 선언
        // -> 작성한 EL 구문이 null일 경우 빈칸으로 출력되어
        //    변수에 값이 대입되지 않는 문제가 발생할 수 있음!
 
        const loginMemberNo = "${loginMember.memberNo}"

        console.log(boardNo);
        console.log(loginMemberNo);
       
       
    </script>
 

 

- console result

- console.log(boardNo) : 1991

- const.log(loginMemberNo) : 4

 

 

- const loginMemberNo = ${loginMember.memberNo}

:  " " 로 감싸주지않으면 값이 없을때 undefined 로 표시된다

* JSP 해석 우선 순위 : Java / EL / JSTL > HTML / CSS /JS *

- const loginMemberNo = "${loginMember.memberNo}"

: " " 문자열로 감싸면 해결우선 순위가 EL이 먼저기 때문에 EL 값이 null이여도 " "(빈문자열)로 출력


VS-Code [  js ]

-  JSP 코드

-  JS 코드

 
  const boardLike = document.getElementById("boardLike");

  // 로그인 여부 검사
  boardLike.addEventListener("click",e =>{

    if(loginMemberNo == ""){
        alert("로그인 후 이용해주세요.");
        return;

    }
 
    let check; // 기존에 좋아요 X(빈하트) :  0
                    // 기존에 좋아요 O(꽉찬하트) : 1
 
    if(e.target.classList.contains("fa-regular")){ // 좋아요 X (빈하트)
        check = 0;
    } else{ /// 좋아요 0(꽉찬하트)
        check = 1;
    }

    // 로그인한 회원 번호, 게시글번호, 체크 전달할 데이터

    // ajax로 서버로 제출할 파라미터를 모아둔 JS객체
 
    const data = {"boardNo" : boardNo, "memberNo": loginMemberNo, "check" : check};

    // ajax 코드 작성
    fetch("/board/like" , {
        method : "POST",
        headers : {"Content-Type" : "application/json"},
        body : JSON.stringify(data)
    })
    .then(response => response.text()) // 응답 객체를 필요한 형태로 파싱하여 리턴
    .then(count => {
        console.log("count :" + count);

        if(count == -1){ // INSERT, DELETE 실패 시
            console.log("좋아요 처리 실패");
            return;
        }

      
        e.target.classList.toggle("fa-regular");
        e.target.classList.toggle("fa-solid");

        // 현재 게시글의 좋아요 수를 화면에 출력
        e.target.nextElementSibling.innerText = count;
       
    }) // 파싱된 데이터를 받아서 처리하는 코드 작성

    .catch( err=> {
        console.log("예외 발생");
        console.log(err);

    })
   
 });
 

* Key Point!

- contains("클래스명") : 클래스가 있으면 true, 없으면 false

- JSON.Stringify(data) : JS객체 ->  JSON 변환

- JSON.parse(data) : JSON ->  JS객체 변환

- toggle() : class가 있으면 없애고, 없으면 추가


Spring

- BoardController

- paramMap : <k.v>값으로 js - ajax에서 요청한 데이터가 들어가있음.

-> System.out.println(paramMap) : {boardNo=1986, memberNo=4, check=0}

 

- BoardService

- BoardServiceImpl

* Key Point!

- SQL 수행 결과가  0 == DB 또는 파라미터에 문제기 있다 판단 return = -1 대입

 

- BoardDAO

- board-mapper.xml

* Key Point!

- insert / delete 구문에는  DML 구문이라 resultType이 필요하지 않지만

  select 하는 구문에서는 resultType= "_int"  int형에 결과값이 나온다고 적어줘야한다

Result [ Chrom Browser ]

- 로그인 하지않고 좋아요 버튼 클릭시 alret 창으로 "로그인한 후 이용해주세요" 출력

- 로그인 후  좋아요 버튼 클릭시  색깔이 채워지면서 좋아요 갯수 증가