반응형

게시판이 있는 사이트 라면 꼭 있는 기능중에 하나인 

좋아요 기능을 만들어 보려고 한다. 

 

좋아요는 한 게시글당 하나만 누를 수 있으면 누를 경우 

좋아요 취소로 바뀌게 된다. 

 

시작 해보자 .


 

좋아요 및 취소 기능

 

우선 테이블을 만들자.

 

/*
 	create table vegan_like(
	like_no int(30) AUTO_INCREMENT PRIMARY KEY not null,
    board_no int(30),
    user_no int(30),
    likeNum int(5)
);
 */

나는 따로 테이블을 생성했다. 

 

그 후 VO 객체를 하나 만들어 준다. 

 

@Getter
@Setter
@ToString
public class LikeVO {
	private int like_no;
	private int board_no;
	private String user_no;
	private int freeboard_like;

먼저 해야 할 것은 

해당 게시글에 좋아요를 눌렀는가? 안눌렀는가? 부터 알아야 한다. 

 

그래서 매퍼에 쿼리문을 작성했다. 

	<!-- 좋아요 눌럿는지 안눌럿는지 -->
	<select id="findLike" resultType="int">
		select count(*) from vegan_like where board_no = #{board_no} and user_no = #{user_no}
	</select>

이렇게 하면 1또는 0이 오는데 1이 오면 좋아요 취소를 보여주고 0이면 좋아요를 보여주면 된다. 

 

//	상세보기
	@GetMapping("/freeDetail")
	public void freeDetail(int freeboard_no, String user_id,Model model) {
		
		System.out.println("상세보기 페이지");
		model.addAttribute("Detail", service.freeDetail(freeboard_no));
		
		LikeVO like = new LikeVO();
		
		like.setBoard_no(freeboard_no);
		like.setUser_no(user_id);
		
		model.addAttribute("like", service.findLike(freeboard_no, user_id));
		model.addAttribute("getLike", service.getLike(freeboard_no));
		service.hit(freeboard_no);
		
		
		
	}

기존 상세보기에서 likevo 객체를 선언해주고 

getlke로 메퍼에서 오는 값을 모델로 뷰로 던져준다.  

 

이때 유저 아이디와 글 번호를 받게 된다. 

 

var likeval = ${like};
		
		let board_no = ${Detail.freeboard_no};
		let user_no = '${login.user_id}';
		if(likeval > 0){
			console.log(likeval + "좋아요 누름");
			$('.LikeBtn').html("좋아요 취소");
			$('.LikeBtn').click(function() {
				$.ajax({
					type :'post',
					url : '<c:url value ="/FreeBoard/likeDown"/>',
					contentType: 'application/json',
					data : JSON.stringify(
							{
								"board_no" : board_no,
								"user_no" : user_no
							}		
						),
					success : function(data) {
						alert('취소 성공');
					}
				})// 아작스 끝
			})

		}else{
			console.log(likeval + "좋아요 안누름")
			console.log(user_no);
			$('.LikeBtn').click(function() {
				$.ajax({
					type :'post',
					url : '<c:url value ="/FreeBoard/likeUp"/>',
					contentType: 'application/json',
					data : JSON.stringify(
							{
								"board_no" : board_no,
								"user_no" : user_no
							}		
						),
					success : function(data) {
						alert('성공염');
					}
				})// 아작스 끝
			})

일단 모든 자바스크립트를 보여주었지만 위에 언급한대로 

0이 오면 좋아요 버튼을

1이 오면 좋아요 취소 버튼을 보여주고 

그에 따라 동작 하게 하면 된다. 

 

이제 좋아요를 구현해보자 

 

먼저 매퍼 부터 구현하자. 

 

	<insert id="likeUp">
		insert into vegan_like (like_no ,board_no , user_no, freeboard_like)
		values((select * from (select max(like_no)+1 from vegan_like) next), #{board_no},#{user_no},1)
	</insert>

이렇게 인서트로 좋아요 버튼을 누르면 1을 눌러 좋아요를 카운트 업을 시켜준다. 

 

반대로 취소는 

 

	  <delete id="likeDown">
	  	delete from vegan_like where board_no = #{board_no} and user_no = #{user_no} 
	  </delete>

딜리트 이다. 

 

컨트롤러를 보자 

 

	@ResponseBody 
	@PostMapping("/likeUp")
	public void likeup(@RequestBody LikeVO vo) {
		System.out.println("컨트롤러 연결 성공");
		System.out.println(vo.getBoard_no());
		System.out.println(vo.getUser_no());
		service.likeUp(vo.getBoard_no(), vo.getUser_no());
	
	}
	
	@ResponseBody
	@PostMapping("/likeDown")
	public void likeDown(@RequestBody LikeVO vo) {
		System.out.println("좋아요 싫어요!");
		service.likeDown(vo.getBoard_no(), vo.getUser_no());
	}

좋아요 싫어요 모두 같은 코드가서 딱히 설명한 것이 없다. 

 

이렇게 코드를 짜면 대략 좋아요 기능이 완성 되었을 것이다. 

 

좋아요 버튼을 누르면 

 

이렇게 좋아요 카운트가 올라가고 좋아요 취소버튼으로 바뀐다.

그 후 좋아요 취소 버튼을 누르면  

다시 기존대로 변경된다. 


댓글 및 조아요 제목에 보이기

 

이제 메인에 좋아요를 뿌려보자 

 

우선 매퍼를 수정해주자 

기존 리스트 매퍼에서 

스칼라 서브쿼리를 이용하여 좋아요 및 댓글 수를 카운트 해보자 

 

     
     <select id="getFreeBoard" resultType="com.vegan.recipe.freeBoard.freeboardVO">

     	select *,
     	(select count(*) from vegan_comment where bno = v.freeboard_no) as com_cnt,
		(select count(*) from vegan_like where board_no = v.freeboard_no) as like_cnt
     	 from Vegan_freeBoard  v
     	<include refid="search" />
     	order by freeboard_no desc
     	limit #{pagecnt} ,  #{countPerPage}

     	
     </select>

서브 쿼리로 댓글 개수는 com_cnt

좋아요 개수는 like_cnt로 선언 했다.

 

그리고 boardVO객체에 위에 cnt들을 추가 해주자 

	private int freeboard_no;
	private String freeboard_title;
	private String freeboard_writer;
	private String freeboard_content;
	private int freeboard_hit;
	private int freeboard_like;
	private String uploadpath;
	private String fileloca;
	private String filename;
	private String ilerealname; // 파일리얼네임
	private Timestamp freeboard_regDate;
	private int com_cnt;
	private int like_cnt;

추가 됫다. 

 

그후 컨트롤러는 이미 뿌려주고 있으니 생략하지만 코드를 봐보자

 

	@GetMapping("/freeList")
	public String getFree(Model model, PageVO vo) {
		System.out.println("자유 게시판으로 이동");
		System.out.println("검색어" + vo.getKeyword());
		System.out.println("검색조건" + vo.getCondition());
		
		PageCreate pc = new PageCreate();
		pc.setPaging(vo);
		pc.setArticleTotalCount(service.getTotal(vo));
		
		System.out.println(pc);
		vo.setPagecnt((vo.getPageNum()-1) * vo.getCountPerPage());
		model.addAttribute("freeList", service.getFreeBoard(vo));
		model.addAttribute("pc", pc);
		
		return "FreeBoard/freeList";
	}
//	글쓰기페이

이제 freeList라는 이름으로 jsp에 뿌려주면 된다. 

 

        <c:forEach var="vo" items="${freeList}">
          <tr>
          	<th scope="row">${vo.freeboard_no}</th>
            <td><a href="<c:url value='/FreeBoard/freeDetail?freeboard_no=${vo.freeboard_no}&user_id=${login.user_id}'/>">${vo.freeboard_title} (${vo.com_cnt})</a></td>
            <td>${vo.freeboard_writer}</td>
            <td>${vo.freeboard_regDate}</td>
            <td>${vo.freeboard_hit}</td>
            <td>${vo.like_cnt}</td>
          </tr>
         </c:forEach>
        </tbody>

이렇게 완성 되었다. 

 

오늘의 포스팅 끝 !!

 

점점 사이트가 완성 되간다.

이제 이 기능들을 토대로 레시피만 완성 하면 끝난다

 

아마 5월 초까지 완성하지 않을까 싶다.

 

파이팅 

 

https://github.com/MoonSeokHyun

반응형

+ Recent posts