본문 바로가기
Spring/JPA + Security

[Spring Data JPA] 구독하기 구현하기 - 1 구독 정보 DB 완성 및 구현

by pyogowoon 2023. 1. 10.

 

저번에   https://pyogowoon.tistory.com/54  에서 만든 구독하기 네이티브 쿼리를 사용하여

구독하기를 해놓은 상태의 사진이다, 현재 프론트엔드단은 구현하지 않았기 떄문에 변화가 없고 DB에만 저장되는 상황이다.

 

구독하기를 구현하기 위해선 여러개의 쿼리가 들어가야한다. 최소로 3명이 사용한다고 가정하고 쿼리를 짜야한다.

 

 

생각을 해보자. 내가 1번 유저고 2번유저의 화면을 본다고 가정했을 때,  2번 유저가  가진 구독자 수를 구해야 한다.

 

 

이렇게 쿼리를 짜면 2번 유저가 가진 구독자의 수를 구할 수 있을것이다.

 

 

 

 

다음번으로 구독 여부를 확인해야하는데, 내가 1번유저고 2번유저를 구독했는지 확인해야 한다면

 

 

 이런식의 쿼리를 짜면 알수있다.

 

 

public interface SubscribeRepository extends JpaRepository<Subscribe, Integer> {

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

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

DB에서 만든 쿼리를 그대로 복사해서 ( ; 세미콜론은 뺴고 복사)

 네이티브 쿼리 안에 그대로 붙여 넣어주고, 쿼리를 1번유저와 2번유저를 기준으로 했던것을 ->    : 파라메터값 으로 바꿔준다,

 

 여기서 @Param을 적는 이유는 java8 버전 이후로 @Param을 적어주지않으면 오류걸린다.

 그리고 이전 네이티브 쿼리와 다르게 SELECT문 이기 때문에 @Modifying은 붙이지않아도 된다.

 

이제 DTO를 통해서 가공만 해주면 된다.

 

Controller 는 건드릴 필요 없다.

 

UserService로 가서

 

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

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

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


        return dto;

    }
}

SubscribeState 는 boolean 으로 잡았기 때문에  == 1 을 주었다.

 

 

<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 에서 EL태그를 통해 세션을 만져주면 끝.

댓글