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

Refactor: 챌린지 조회 시 챌린지 목표 값까지 같이 리턴할 수 있게 수정 #318

Merged
merged 5 commits into from
Dec 11, 2024

Conversation

hee9841
Copy link
Collaborator

@hee9841 hee9841 commented Dec 10, 2024

🔗 이슈 연결

🚀 구현한 API

  • /api/v1/challenges

💡 반영할 내용 및 변경 사항 요약

  • Response에 큰 변동 사항이 없어 기존 v1 API를 유지하고, 기존 ReponseDTO에 목표 값과 챌린지 타입 필드를 추가합니다.
  • 기존의 service단의 getChallenges 메서드를 다음과 같이 수정합니다.
    • AS-IS: 사용자의 어제의 러닝 기록이 있을 경우, 어제의~ 와 관련된 챌린지도 같이 조회해서 랜덤으로 2개 리턴
    • TO-BE
      • 사용자가 어제의 러닝 기록이 없을 경우, 어제의~ 와 관련된 챌린지를 제외
      • 필터링한 챌린지에서 랜덤으로 2개 추출
      • 랜덤 2개의 챌린지 중 어제의~ 와 관련된 챌린지가 포합되었을 경우, 사용자의 어제의 러닝기록(첫번째로 조회되는)을 이용해서 챌린지 목표값 리턴할 수 있게 함

🔍 리뷰 요청/참고 사항

  • 머지는 12시에서 새벽사이에 진행 할 예정입니다.
  • DB에 페이스 관련 챌린지의 isActive 값을 false로 변경 완료했습니다.

- findAllIsNotDefeatYesterday, findAllChallenges 함수 삭제
- 서비스단 재 구성으로 서비스단 함수 삭제 및 컨트로러 주석화
- getChallenges 함수 리턴값이 챌린지 목표 값을 가져오게 재 구성
= 필요한 리스펀스 필드 추가
@hee9841 hee9841 added the refactor 코드 리팩토링 label Dec 10, 2024
@hee9841 hee9841 self-assigned this Dec 10, 2024
@hee9841 hee9841 requested a review from Jaewon-pro December 10, 2024 12:22
condition.goalMetricType().getActualValue(runningRecords.getFirst())));
}
}
}
Copy link
Member

Choose a reason for hiding this comment

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

함수에 관한 코멘트

if (runningRecords.isEmpty())와 밑에서 if (!runningRecords.isEmpty())를 사용하고 있어요

→ if else 로 allChallengesWithConditions 변수를 처리한 다음에, 밑에서 shuffle하고 결과값을 반환하면 어떨까요?

if (runningRecords.isEmpty()) {
    allChallengesWithConditions.removeIf(challenge ->
            challenge.challenge().isDefeatYesterdayChallenge()
    );
} else {
    allChallengesWithConditions.stream()
            .filter(challenge -> challenge.challenge().isDefeatYesterdayChallenge())
            .forEach(challenge -> challenge.conditions().forEach(condition ->
                    condition.registerComparisonValue(
                            condition.goalMetricType().getActualValue(runningRecords.getFirst())
                    )
            ));
}

Random randomWithSeed = new Random(todayMidnight.toEpochSecond());

Collections.shuffle(allChallengesWithConditions, randomWithSeed);

return allChallengesWithConditions.stream().limit(2).toList();

Comment on lines 42 to 44
allChallengesWithConditions = allChallengesWithConditions.stream()
.filter(challengeWithCondition ->
!challengeWithCondition.challenge().isDefeatYesterdayChallenge())
Copy link
Member

Choose a reason for hiding this comment

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

removeIf()를 사용하면 변수 대입이 없어서 좋을 것 같아요

Suggested change
allChallengesWithConditions = allChallengesWithConditions.stream()
.filter(challengeWithCondition ->
!challengeWithCondition.challenge().isDefeatYesterdayChallenge())
allChallengesWithConditions.removeIf(challenge ->
challenge.challenge().isDefeatYesterdayChallenge()
);

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

removeIf()가 있군요! 좋은거 같아요!

Comment on lines 54 to 62
for (ChallengeWithCondition challenge : randomChallengeWithConditions) {
if (challenge.challenge().isDefeatYesterdayChallenge()) {
// 어제의 기록과 관련된 챌린지면, 챌린지 비교할 값(성공 유무를 위한 목표 값) 재등록
challenge
.conditions()
.forEach(condition -> condition.registerComparisonValue(
condition.goalMetricType().getActualValue(runningRecords.getFirst())));
}
}
Copy link
Member

Choose a reason for hiding this comment

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

!runningRecords.isEmpty()일 때 for 문이나 스트림 중에 사용하면 좋을 것 같은데, 스트림도 괜찮은 것 같아서 예시로 사용해봤어요

보시고 성희님이 더 읽기 쉬운 방식으로 고르시면 될 것 같아요!

Suggested change
for (ChallengeWithCondition challenge : randomChallengeWithConditions) {
if (challenge.challenge().isDefeatYesterdayChallenge()) {
// 어제의 기록과 관련된 챌린지면, 챌린지 비교할 값(성공 유무를 위한 목표 값) 재등록
challenge
.conditions()
.forEach(condition -> condition.registerComparisonValue(
condition.goalMetricType().getActualValue(runningRecords.getFirst())));
}
}
allChallengesWithConditions.stream()
.filter(challenge -> challenge.challenge().isDefeatYesterdayChallenge())
.forEach(challenge -> challenge.conditions().forEach(condition ->
condition.registerComparisonValue(
condition.goalMetricType().getActualValue(runningRecords.getFirst())
)
));

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

위에서 재원님이 if (runningRecords.isEmpty())관해서 말한 대로 if else로 처리한 다음에 스트림으로 처리하는게 더 좋아보이네요!

@hee9841 hee9841 requested a review from Jaewon-pro December 11, 2024 10:12
Copy link
Member

@Jaewon-pro Jaewon-pro left a comment

Choose a reason for hiding this comment

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

고생하셨습니다 👍👍

@hee9841 hee9841 merged commit 88f67dd into main Dec 11, 2024
1 check passed
@hee9841 hee9841 deleted the refactor/#310/challenges branch December 11, 2024 15:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
refactor 코드 리팩토링
Projects
None yet
Development

Successfully merging this pull request may close these issues.

challenges에서 nullable한 goalDistance, goalTime을 리턴할 수 있게 수정
2 participants