-
Notifications
You must be signed in to change notification settings - Fork 2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
소셜 기능 (찜하기, 조회수) 구현 #20
base: develop
Are you sure you want to change the base?
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
수고하셨습니다!
@GetMapping("/products/likes/{userId}") | ||
public ApiResponse<List<LikeEntity>> getLikedProductsByUser(@PathVariable Long userId) { | ||
List<LikeEntity> likeEntities = likeService.getLikedProductsByUser(userId); | ||
return ApiResponse.success(likeEntities); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
본인이 아닌 다른 사람의 좋아요를 조회할 경우가 있을까요..?
저는 자신의 좋아요만 조회해도 될 것 같아서 myPage 안의 기능과 통합했습니다!
// 다른 사용자가 좋아요를 누를 때 값이 변경되므로 동시성 처리를 위해 락 사용 | ||
@Query("SELECT COUNT(l) FROM LikeEntity l WHERE l.product.id = :productId") | ||
@Lock(LockModeType.PESSIMISTIC_READ) | ||
Long countByProductId(@Param("productId") Long productId); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
productEntity에 likeCount
변수가 있는데 개수를 DB에서 직접 세서 가져오는 이유가 있나요?
} | ||
|
||
// 좋아요 증가 (DB 업데이트 하지 않음) | ||
@Transactional |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
toggleLike 함수 내에 있는 함수라 빼도 될 것 같습니다.
validateUserAndProductExistence(userId, productId)
이것도요!
String redisKey = LIKE_KEY_PREFIX + productId; | ||
|
||
// Redis에서 좋아요 수 조회 | ||
String likeCount = (String) redisTemplate.opsForValue().get(redisKey); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
왜 string type으로 반환하나요?
if (likeCountFromDb == 0) { | ||
// Redis에 값이 없으면 초기값을 설정 | ||
redisTemplate.opsForValue().set(redisKey, "1"); | ||
} else { | ||
// DB에 좋아요 수가 0이 아니면 Redis에 해당 값을 저장 | ||
redisTemplate.opsForValue().set(redisKey, String.valueOf(likeCountFromDb)); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
redis의 increment 기능이 키가 없을시 기본값을 0으로 해서 increment를 쓰면 한번에 해결될 것 같습니다!
참고 : https://redis.io/docs/latest/commands/incr/
|
||
String redisKey = LIKE_KEY_PREFIX + productId; | ||
|
||
String likeCount = (String) redisTemplate.opsForValue().get(redisKey); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
없어도 되는 코드인 것 같습니다.
} | ||
|
||
// 스케줄러로 Redis에 저장된 데이터를 DB에 합치고 Redis에서 삭제하는 작업 | ||
@Scheduled(cron = "0 0 * * * *") // 10분 마다 실행 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
cron 표현식이 매 정시마다(정각) 작업이 실행되는 것 같은데 10분마다면 바꿔야 할 거같습니다.
@Scheduled(cron = "0 */10 * * * *")
그리고 가독성 면에서 fixedRate
를 추천합니다!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
쿠키에 저장하는 방식도 좋은 것 같네요!
다만 보안성이나 추후 확장성에 있어 고려해야 할 부분도 있을 거 같아요
조회수가 추후 인기 상품 추천 알고리즘, 유저 관심사 분석에 사용되는 경우가 있을 거 같네요
1. 좋아요
2. 조회수