본문 바로가기
Spring/JPA + Security

[Spring Data JPA] 좋아요 구현하기 -6 프로필 페이지 좋아요 카운트 구현

by pyogowoon 2023. 1. 14.

 

 

 현재 프로필에서 마우스를 올리면 좋아요 카운트가 뜨는것을 구현하고자 한다.

 

우리는 이미 포토 게시판 구현하기에서 카운트를 구현했기 때문에 가져오기만 하면 된다.

 

@GetMapping("user/{pageUserId}")
public String profile(@PathVariable int pageUserId, Model model,@AuthenticationPrincipal PrincipalDetails principalDetails){
    UserProfileDto dto = userService.회원프로필(pageUserId,principalDetails.getUser().getId());

    model.addAttribute("dto", dto);


    return "user/profile";
}

우리가 아주 전에 구현했던 프로필을 보면 우리는 Dto 를 구현해서 세션에 담아서 가져갔다.

(코드 수정된건 없음)

 


@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
public class UserProfileDto {

    private boolean pageOwnerState;

    private User user;

    private int imageCount;

    private boolean subscribeState;

    private int subscribeCount;


}

그리고 Dto 에 보면 User 타입의 user 가 있다.

(여기도 코드 변한건 없음)

 

즉 말하고싶은건

 

User 도메인에 들어가보면 이곳 역시 양방향 맵핑으로 인해 Image를 가지고있고 Image에는 ImageCount

를 가지고있다. 즉 우리는 데이터를 그냥 Dto 타고-> 타고-> 타고->  쭉쭉 들어가서 사용하면 된다는거다.

 

 

 

<div class="img-box">
            <a href=""> <img src="/upload/${image.postImageUrl}"/>
            </a>
            <div class="comment">
               <a href="#" class=""> <i class="fas fa-heart"></i><span>${image.likeCount}</span>
               </a>
            </div>
         </div>

그래서 profile.jsp 에서 프로필 페이지 좋아요 갯수를 구하기 위해 {image.likeCount} 를 넣어보았다. 하지만 값은 0 으로뜬다.

이런 이유는 우리가 likeCount를 따로 DB에 저장하지않았기 때문인데.

(이전에 @Transient 를 사용했고, service 단에서 만들어서 데이터를 보냈었다.)

 DB로 꺼내오는 방법이 아닌 service단에서 image -> getLikes().size를 해서 좋아요 갯수를 가져와야 한다.

 

@Transactional(readOnly = true)
public UserProfileDto 회원프로필(int pageUserId, int principalId) {
    UserProfileDto dto = new UserProfileDto();

											
                                            .
                                            .
                                            .
                                            .
                                            .
                                            


    userEntity.getImages().forEach((image) -> {
        image.setLikeCount(image.getLikes().size());

    });

    return dto;
}

userService 에서 맨밑에 실체화된 DB인 likes 의 값의 사이즈를 읽어와서

setLikeCount 에 셋 해주거나

 

 OR

 

<div class="comment">
   <a href="#" class=""> <i class="fas fa-heart"></i><span>${image.getLikes().size()}</span>
   </a>
</div>

 이렇게 사이즈로 받아도 된다. 둘중 하나 하면된다.

 

댓글