Skip to content
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

Open
wants to merge 3 commits into
base: develop
Choose a base branch
from

Conversation

chanyoungit
Copy link
Member

1. 좋아요

  • Redis를 사용하여 좋아요 수를 빠르게 처리
  • 일정 주기로 Redis의 데이터를 DB와 동기화하여 성능과 데이터 일관성 유지
  • 좋아요 수 조회는 Redis에서 우선적으로 확인하고, 데이터가 없으면 DB에서 가져와 캐시

2. 조회수

  • 상품 조회 여부 체크 : 사용자가 상품을 클릭할 때마다 해당 상품이 이미 조회되었는지 세션 쿠키를 통해 확인
  • 상품 조회 수 증가 : 처음 조회한 상품이라면 조회수를 증가시키고, 이를 세션 쿠키에 저장하여 사용자가 다시 조회할 때 조회수가 중복되지 않도록 처리
  • 세션 쿠키 관리: viewedProducts라는 쿠키를 사용하여 사용자가 이미 본 상품 ID를 저장하고, 유효 기간을 1주일로 설정하여 일정 기간 동안 조회 여부를 유지

Copy link
Collaborator

@KimGyeongLock KimGyeongLock left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

수고하셨습니다!

Comment on lines +44 to +48
@GetMapping("/products/likes/{userId}")
public ApiResponse<List<LikeEntity>> getLikedProductsByUser(@PathVariable Long userId) {
List<LikeEntity> likeEntities = likeService.getLikedProductsByUser(userId);
return ApiResponse.success(likeEntities);
}
Copy link
Collaborator

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);
Copy link
Collaborator

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
Copy link
Collaborator

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);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

왜 string type으로 반환하나요?

Comment on lines +98 to +104
if (likeCountFromDb == 0) {
// Redis에 값이 없으면 초기값을 설정
redisTemplate.opsForValue().set(redisKey, "1");
} else {
// DB에 좋아요 수가 0이 아니면 Redis에 해당 값을 저장
redisTemplate.opsForValue().set(redisKey, String.valueOf(likeCountFromDb));
}
Copy link
Collaborator

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);
Copy link
Collaborator

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분 마다 실행
Copy link
Collaborator

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 를 추천합니다!

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

쿠키에 저장하는 방식도 좋은 것 같네요!
다만 보안성이나 추후 확장성에 있어 고려해야 할 부분도 있을 거 같아요
조회수가 추후 인기 상품 추천 알고리즘, 유저 관심사 분석에 사용되는 경우가 있을 거 같네요

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants