-
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
feat: 랭킹 API 구현 #391
feat: 랭킹 API 구현 #391
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.
우선 코멘트 먼저 드립니다😉
void updateSymbolStackAndMemberId( | ||
@Param("memberId") Long memberId, @Param("symbolStack") long symbolStack); |
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.
파라미터 순서와 메소드명 일치 시키면 더 좋을 것 같아욥
public void updateSymbolStack(List<RankingDto> rankingDtos) { | ||
for (RankingDto rankingDto : rankingDtos) { | ||
Ranking ranking = Ranking.createRanking(rankingDto.symbolStack(), rankingDto.member()); | ||
rankingRepository.updateSymbolStackAndMemberId( | ||
ranking.getMember().getId(), ranking.getSymbolStack()); | ||
} | ||
} |
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.
요 메소드 설명 가능할까용?
랭킹 Entity를 생성하고, updateSymbolStackAndMemberId 메소드를 사용하는데,
insert를 하고있어서 약간 메소드명도 수정되어야 할 것 같고,
DUPLICATE KEY UPDATE를 할 때 NOW()를 실행한게 동일한 시간으로 판단되어서 중복으로 보는지도 궁금하네용
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.
해당 메서드는 SymbolStack을 약속한 시간에 갱신하기 위한 메서드이며 스케줄러에서만 사용되는 메서드입니당
rankingDtos는 findAllMissionSymbolStack 메서드로 인한 멤버 별 SymbolStack을 구한 List DTO로 해당 데이터를 갱신하고 있어요
좀 더 명확하게는 duplicate라고 메서드 명을 수정하는 게 낫겟네용👍
update를 할때 NOW()를 실행한 것을 보실때 쿼리가
@Query(
value =
"INSERT INTO Ranking (member_id, symbol_stack, created_at) "
+ "VALUES (:memberId, :symbolStack, NOW()) "
+ "ON DUPLICATE KEY UPDATE member_id = :memberId, symbol_stack = :symbolStack, updated_at = NOW()",
nativeQuery = true)
이처럼 insert 시 created_at에만 NOW(), update 시에는 updated_at에만 NOW() 실행하도록 하고 있어용
동일한 시간으로 판단되어서 중복으로 보는지
에 대한 의미에 대해 다시 알 수 있을까요??
"INSERT INTO Ranking (member_id, symbol_stack, created_at) " | ||
+ "VALUES (:memberId, :symbolStack, NOW()) " | ||
+ "ON DUPLICATE KEY UPDATE member_id = :memberId, symbol_stack = :symbolStack, updated_at = NOW()", |
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.
NOW()를 실행하는 시점에 데이터가 있을때만 업데이트 되는거로 인지했어서 여쭤봅니당
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.
넵 데이터가 있을때만 업데이트되어 업데이트 시간만을 NOW()로 갱신해줍니당
@Transactional(readOnly = true) | ||
public List<RankingDto> findAllMissionSymbolStack() { | ||
List<Mission> missions = missionRepository.findAllMissionWithRecords(); | ||
List<MissionRecord> completedMissionRecords = findCompletedMissionRecords(missions); | ||
|
||
return completedMissionRecords.stream() | ||
.collect(Collectors.groupingBy(MissionRecord::getMember)) | ||
.entrySet() | ||
.stream() | ||
.map(entry -> RankingDto.of(entry.getKey(), symbolStackCalculate(entry.getValue()))) | ||
.collect(Collectors.toList()); | ||
} | ||
|
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.
미션서비스보다 랭킹 서비스에 들어가는게 더 적합해보이는데 어떠세염?
@kdomo 사실 이 부분을 개발하면서 약간 걸렸던게 21시에 스케줄 실행 시 |
아 제가 로직을 잘못이해하고 있었군요, 저는 날짜별로 랭킹에 대한 정보를 남겨놔야된다고 생각하고 있었어서, 기획상 필요하지 않을지 모르겠지만 윤범님이 구현하신 대로라면, |
미션레코드에 존재하는 duration값으로 simbolStack을 계산하고 있으니, 지금 설계대로라면 딱히 방법이 떠오르진 않는군요,
|
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.
테스트도 같이 작성해주시면 좋을듯 합니다
import com.depromeet.domain.ranking.domain.Ranking; | ||
|
||
public interface RankingRepositoryCustom { | ||
void saveOrUpdate(Ranking ranking); |
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.
RepositoryCustom은 QueryDSL 기능을 사용하기 위한 목적을 가지는 것이 아닌가요?
왜 saveAndUpdate가 들어갔는지 궁금합니다.
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.
미사용 메서드입니당
이전 랭킹 데이터를 효율적으로 저장하는 것에 대해 고민하다 그대로 두었네용😅
|
||
public record RankingResponse( | ||
@Schema(description = "사용자 ID", defaultValue = "1") Long memberId, | ||
@Schema(description = "랭킹", defaultValue = "1") long rank, |
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.
멤버 ID에서는 Long을 사용하고, 랭크 및 기타 필드에서는 long을 사용하신 이유가 있나요?
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.
현재 memberId는 일관성 있게 Long으로 사용하였고,
long을 사용하는 이유는 굳이 기타 필드에 참조 타입 Long을 사용할 필요가 없다고 생각했어용
만약 rank나 symbolStack이 int의 범위만으로 충분하다면 int로 바꾸는 것도 고려할만하겠네요!
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.
음 그래도 박싱 / 언박싱 비용 생각해서 일관성 있게 전부 참조타입으로 맞춰주는게�좋지 않을까 싶네요
이거는 선택적으로 적용하시면 될듯 합니다
저도 기획상 필요성에 대해 느껴지지 않지만, 만약 필요하다면 |
Quality Gate passedIssues Measures |
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.
lgtm
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.
LGTM
🌱 관련 이슈
📌 작업 내용 및 특이사항
📝 참고사항
📚 기타