본문 바로가기
Spring/JPA + Security

[Spring Data JPA] 로그인 상태에 따라 다른 구독버튼 / 구독하기 - 1-1

by pyogowoon 2023. 1. 10.

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


    private boolean pageOwnerState;
    private int imageCount;
    private boolean subscribeState;
    private int subscribeCount;
    private User user;
}

 

UserProfileDto 에 subscribeState , subsscribeCount 를 추가한다.

 

 


public interface SubscribeRepository extends JpaRepository<Subscribe, Integer> {

    @Modifying // INSERT , DELETE , UPDATE를 네이티브 쿼리로 작성하려면 해당 어노테이션 필요!
    @Query(value = "INSERT INTO subscribe(fromUserId, toUserId, createDate) VALUES(:fromUserId, :toUserId, now())", nativeQuery = true)
    void mSubscribe(@Param("fromUserId") int fromUserId, @Param("toUserId") int toUserId);  // 1(변경된 행의 개수가 리턴됨), -1
//왜 리턴타입? = JPA의 방식임
    @Query(value = "DELETE FROM subscribe WHERE fromUserId= :fromUserId AND toUserId = :toUserId", nativeQuery = true)
    void mUnSubscribe(@Param("fromUserId") int fromUserId, @Param("toUserId")int toUserId);

    @Query(value ="SELECT COUNT(*) FROM subscribe WHERE fromUserId = :principalId AND toUserId= :pageUserId" , nativeQuery = true)  //select라 modifying 필요없음
    int mSubscribeState(@Param("principalId") int principalId, @Param("pageUserId") int pageUserId);

    @Query(value ="SELECT COUNT(*) FROM subscribe WHERE fromUserId = :pageUserId" , nativeQuery = true)
    int mSubscribeCount(@Param("pageUserId") int pageUserId);
}

 

 

subscirbeRepository  에 2가지 네이티브 쿼리를 추가한다. 

 ※ mSubscribeCount 에서 왜 PageUserId 들어가는지 잘 생각해보자..

-> 당연히 홈페이지 타고 들어간 유저의 구독 수 가 나와야 하니까

 

그리고 mSubscribeState 는 select count(*) 로 구독 되있는 상태라면 1이 뜸

 

 

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


    User userEntity = userRepository.findById(pageUserId).orElseThrow(() -> {
        throw new CustomException("해당 프로필 페이지는 없는 페이지입니다");
    });

    dto.setUser(userEntity);
    dto.setImageCount(userEntity.getImages().size());
    dto.setPageOwnerState(pageUserId == principalId); // true면 주인


    int subscribeState = subscribeRepository.mSubscribeState(principalId, pageUserId);
    int subscribeCount = subscribeRepository.mSubscribeCount(pageUserId);

    dto.setSubscribeCount(subscribeCount);
    dto.setSubscribeState(subscribeState == 1);
    return dto;
}

 

그 후 만들어 놓은 dto 객체에 구독정보를 넣는다.

 

 

<!--유저이미지end-->

      <!--유저정보 및 사진등록 구독하기-->
      <div class="profile-right">
         <div class="name-group">
            <h2>${dto.user.name}</h2>

<c:choose>

<c:when test="${dto.pageOwnerState}">
   <button class="cta" onclick="location.href='/image/upload'">사진등록</button>
</c:when>
<c:otherwise>
<c:choose>

<c:when test= "${dto.subscribeState}">
<button class="cta blue" onclick="toggleSubscribe(this)">구독취소</button>
</c:when>
<c:otherwise>

<button class="cta" onclick="toggleSubscribe(this)">구독하기</button>

</c:otherwise>

</c:choose>

</c:otherwise>

</c:choose>

JSP를 if처리해주면 끝

댓글