@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처리해주면 끝
'Spring > JPA + Security' 카테고리의 다른 글
[Spring Data JPA] 구독하기 구현하기 - 3 구독정보 모달 구현, Mysql 스칼라 서브쿼리 만들기 (0) | 2023.01.11 |
---|---|
[Spring Data JPA] 구독하기 구현하기 - 2 Ajax 연결하기 (0) | 2023.01.11 |
[Spring Data JPA] 구독하기 구현하기 - 1 구독 정보 DB 완성 및 구현 (0) | 2023.01.10 |
[Spring Data JPA]게시물 띄우는 로직 만들기 -2 뷰 렌더링 (0) | 2023.01.10 |
[Spring Data JPA] 게시판 띄우는 로직 만들기 1-1 무한 참조 오류 (0) | 2023.01.10 |
댓글