이번에는 사용자별로 보유한 총 포인트가 몇 포인트인지를 조회할 수 있는 기능을 구현 해보았다.
나는 간단한 쿼리는 Spring Data JPA를 사용하고 있고 좀 더 복잡한 쿼리는 Querydsl를 활용하여 구현하고 있다.
총 포인트를 조회하는 쿼리는 조건절도 필요하고 집계함수 sum을 사용하여 보여줄 것이기 때문에 Querydsl을 사용하였다.
PointHistoryRepoSupport
public GetTotalPointDto getTotalPoint(Long userId) {
JPAQuery<GetTotalPointDto> query = jpaQueryFactory
.select(Projections.bean(GetTotalPointDto.class,
qPointHistory.amount.sum().as("totalPoint"), qPointHistory.userId))
.from(qPointHistory)
.where(qPointHistory.userId.eq(userId));
return query.fetchOne();
}
나는 totalPoint라는 이름으로 총 포인트를 보여주고 싶어서 alias를 사용하였다.
GetTotalPointDto
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class GetTotalPointDto {
private Long totalPoint;
private Long userId;
}
PointHistoryService
public GetTotalPointDto getPointTotal(Long userId) {
return pointHistoryRepoSupport.getTotalPoint(userId);
}
총 포인트를 조회할 일이 많으면 여기에서 캐시를 적용해도 좋을 것 같다.
PointApi
@PreAuthorize("hasRole('ROLE_USER')")
@GetMapping("/total")
public ApiResult<GetTotalPointDto> getTotalPoint(@LoginUser CustomUserDetails customUserDetails) {
return success(pointHistoryService.getPointTotal(customUserDetails.getUserId()));
}
userId를 직접 받아오지 않아도 로그인된 사용자로부터 userId를 가져올 수 있도록 @LoginUser를 적용하였다.
구현을 완료하고 swagger로 확인해보면,
결과값이 제대로 나오는 것을 확인할 수 있었다.
이제 포인트 사용, 포인트 내역 조회, 포인트 만료 스케줄러 등 하나씩 차근차근 마저 구현해보도록 해야겠다.
'개발' 카테고리의 다른 글
[개발] 포인트 차감 (0) | 2024.05.30 |
---|---|
[개발] Maven 의존성 추가 (0) | 2024.05.28 |
[개발] 포인트 적립 구현 - 2 (0) | 2024.04.16 |
[개발] 포인트 적립 구현 - 1 (0) | 2024.04.15 |
포인트 기능 요구사항 정리 (0) | 2024.04.11 |