SpringFramework에서 구현했던 좋아요 기능을 이번 프로젝트에서도 구현하려 한다.
이번에는 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에서는 잘 되던 게 잘 안되니까 고생을 많이 했다!!
그리고 오류가 많이 나고 피곤할 때는 역시 코딩을 멈추고 쉬는 게 나은 것 같다. 쉬고 상쾌한 머리로 보니까 오류가 잘 보였다. 이 상쾌한 머리로 장바구니 기능까지 고고!
아! 좋아요를 취소할 때 페이지 로딩이 오래걸리는데 이 부분을 꼭 보완해야겠다.