[22/02/23] SpringBoot좋아요 기능 구현하기

Que Lin·2022년 2월 23일
2


SpringFramework에서 구현했던 좋아요 기능을 이번 프로젝트에서도 구현하려 한다.

🧐 설계

  1. 상세게시글을 조회할 때 로그인 회원의 좋아요 체크해서 좋아요 했는지 보여주기
  2. 정보가 있다면 좋아요의 하트가 채워진 채로 유저에게 보여지고
  3. 없다면 빈 하트가 보여진다.
  4. 좋아요를 누르지않은 유저가 누른다면 save 아니라면 delete 를 한다!

이번에는 like check 컬럼 없이 null값으로 비교하려고 한다.

LikeEntity

@Entity
@Getter
@Setter
@Table(name = "like_table")
public class LikeEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "like_id")
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "member_id")
    private MemberEntity memberEntity;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "board_id")
    private BoardEntity boardEntity;

    public static LikeEntity toLikeEntity(MemberEntity memberEntity, BoardEntity boardEntity){
        LikeEntity likeEntity = new LikeEntity();
        likeEntity.setMemberEntity(memberEntity);
        likeEntity.setBoardEntity(boardEntity);

        return likeEntity;
    }


}

html의 스크립트는 전과 비슷하다.

<script>
    $(document).ready(function () {
        let likeVal = document.getElementById('like_check').value
        const boardId = $("#boardId").val();
        const memberId = $("#memberId").val();
        console.log(memberId);
        console.log(likeVal);
        const likeImg = document.getElementById("likeImg")

        if (likeVal > 0) {
            likeImg.src = "/assets/img/like_click.png";
        } else {
            likeImg.src = "/assets/img/like_empty.png";
        }
        // 좋아요 버튼을 클릭 시 실행되는 코드
        $("#likeImg").on("click", function () {
            $.ajax({
                url: '/board/like',
                type: 'POST',
                data: {'boardId': boardId, 'memberId': memberId},
                success: function (data) {
                    if (data == 1) {
                        $("#likeImg").attr("src", "/assets/img/like_click.png");
                        location.href="/board/"+boardId;

                    } else {
                        $("#likeImg").attr("src", "/assets/img/like_empty.png");
                        location.href="/board/"+boardId;
                    }
                }, error: function () {
                    $("#likeImg").attr("src", "/assets/img/like_click.png");
                    console.log('오타 찾으세요')
                }

            });

        });
    });
</script>

boardController

 // 상세조회
    @GetMapping("{boardId}")
    public String findById(@PathVariable("boardId") Long boardId, Model model, HttpSession session){
        BoardDetailDTO boardDetailDTO = bs.findById(boardId);
        List<CommentDetailDTO> commentList = cs.findAll(boardId);
        // memberId 세션값 가져오기
        Long memberId = (Long) session.getAttribute(LOGIN_ID);

        model.addAttribute("board",boardDetailDTO);
        model.addAttribute("commentList",commentList);

        bs.findLike(boardId,memberId);

        int like = bs.findLike(boardId,memberId);
        model.addAttribute("like",like);

        return "/board/findById";
    }
//좋아요
    @PostMapping("/like")
    public @ResponseBody int like(Long boardId, Long memberId) {
        int result = bs.saveLike(boardId,memberId);
        return result;
    }

게시물 아이디와 회원의 아이디를 같이 가져가서 조회하기 때문에 새로 repository에 메서드를 만들어서 조회한다.

nullPointErexception 때문에 고생했지만 Optional로 감싸고 empty로 값을 비교하니까 잘 넘어갈 수 있었다.

 @Override
    public int findLike(Long boardId, Long memberId) {
        // 저장된 DTO 가 없다면 0, 있다면 1

        Optional<LikeEntity> findLike = lr.findByBoardEntity_IdAndMemberEntity_Id(boardId, memberId);


        if (findLike.isEmpty()){
            return 0;
        }else {

            return 1;
        }
    }

    @Transactional
    @Override
    public int saveLike(Long boardId, Long memberId) {
        Optional<LikeEntity> findLike = lr.findByBoardEntity_IdAndMemberEntity_Id(boardId, memberId);

        System.out.println(findLike.isEmpty());

        if (findLike.isEmpty()){
            MemberEntity memberEntity = mr.findById(memberId).get();
            BoardEntity boardEntity = br.findById(boardId).get();

            LikeEntity likeEntity = LikeEntity.toLikeEntity(memberEntity, boardEntity);
            lr.save(likeEntity);
            br.plusLike(boardId);
            return 1;
        }else {
            lr.deleteByBoardEntity_IdAndMemberEntity_Id(boardId, memberId);
            br.minusLike(boardId);
            return 0;

        }

    }

LikeRepository

public interface LikeRepository extends JpaRepository<LikeEntity,Long> {
    Optional<LikeEntity> findByBoardEntity_IdAndMemberEntity_Id(Long boardId, Long memberId);
    void  deleteByBoardEntity_IdAndMemberEntity_Id(Long boardId, Long memberId);
}

Spring FrameWork에서는 잘 되던 게 잘 안되니까 고생을 많이 했다!!
그리고 오류가 많이 나고 피곤할 때는 역시 코딩을 멈추고 쉬는 게 나은 것 같다. 쉬고 상쾌한 머리로 보니까 오류가 잘 보였다. 이 상쾌한 머리로 장바구니 기능까지 고고!

아! 좋아요를 취소할 때 페이지 로딩이 오래걸리는데 이 부분을 꼭 보완해야겠다.

profile
1일 1커밋 1일 1벨로그!

0개의 댓글