Skip to content

[BUG] 팀 액티비티 날짜별 해결 현황이 과거 날짜에도 소급 표시되는 문제 #149

@ryuwldnjs

Description

@ryuwldnjs

[Bug] 팀 액티비티 날짜별 해결 현황이 과거 날짜에도 소급 표시되는 문제

설명

팀 액티비티 API(GET /api/teams/{teamId}/activity)에서 날짜별 해결 현황을 보여줄 때, 과거에 추천받았지만 풀지 못한 문제를 나중에 다시 추천받아 해결하면, 과거 날짜에도 "해결"로 표시된다.

Image

재현 시나리오

  1. 2월 6일: 팀에 Problem A가 추천됨
  2. 2월 6일: 사용자가 Problem A를 풀지 않음
  3. 2월 10일: Problem A가 다시 추천됨
  4. 2월 10일: 사용자가 Problem A를 해결하고 인증함

기대 결과:

  • 2월 6일 활동: Problem A → 미해결
  • 2월 10일 활동: Problem A → 해결

실제 결과:

  • 2월 6일 활동: Problem A → 해결 (잘못된 표시)
  • 2월 10일 활동: Problem A → 해결

원인 분석

TeamActivityService.loadMemberSolvedStatuses()에서 MemberSolvedProblem을 조회할 때 solvedAt 시간을 고려하지 않고, 단순히 Set<Long> (풀었는지 여부만)으로 변환한다.

// MemberSolvedStatus - 현재 구조
public record MemberSolvedStatus(
    Long memberId,
    Set<Long> solvedProblemIds  // ← 날짜 정보 없음
) {
    public boolean hasSolved(Long problemId) {
        return solvedProblemIds.contains(problemId);  // ← "한 번이라도 풀었으면 true"
    }
}
// loadMemberSolvedStatuses() - 현재 로직
Map<Long, Set<Long>> memberSolvedMap = solvedRecords.stream()
    .collect(Collectors.groupingBy(
        msp -> msp.getMember().getId(),
        Collectors.mapping(msp -> msp.getProblem().getId(), Collectors.toSet())
        // ← solvedAt 정보가 여기서 유실됨
    ));

이렇게 생성된 MemberSolvedStatus가 모든 날짜의 DailyActivity에서 동일하게 사용되므로, 한 번이라도 풀었으면 모든 추천일에서 "해결"로 표시된다.

해결 방안

solvedAt을 활용하여, 각 추천일의 미션 사이클(06:00~다음날 06:00) 내에 풀었을 때만 "해결"로 표시하도록 변경.

변경 대상

파일 변경 내용
MemberSolvedStatus Set<Long>Map<Long, LocalDateTime>, hasSolvedDuring() 메서드 추가
TeamActivityService 미션 사이클 구간 계산 후 hasSolvedDuring()으로 판단하도록 수정

변경하지 않는 것

  • 리더보드: "언제 풀었든 풀었으면 1개" 카운트가 맞으므로 현행 유지
  • 엔티티/Repository: 이미 solvedAt 필드가 존재하므로 변경 불필요

알려진 제약사항

  • solvedAt은 사용자가 앱에서 "인증" 버튼을 누른 시각이며, BOJ 실제 풀이 시각과 다를 수 있음

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions