Skip to content

[REFACTOR] solve 도메인 신설 — 풀이 인증/기록/랭킹 분리 #160

@ryuwldnjs

Description

@ryuwldnjs

배경

현재 "누가 어떤 문제를 풀었는가"에 대한 책임이 member, team 2개 도메인에 흩어져 있음.

현재 위치 기능 핵심 데이터
member/MemberService 문제해결 인증 (verifyProblemSolved) MemberSolvedProblem
member/MemberService 일별 풀이 현황 (getDailySolved) MemberSolvedProblem
member/RankingService 전체 랭킹 (getGlobalRanking) MemberSolvedProblem
member/domain MemberSolvedProblem 엔티티 MemberSolvedProblem
member/repository MemberSolvedProblemRepository MemberSolvedProblem

→ 모두 MemberSolvedProblem 하나의 엔티티를 중심으로 쓰기/읽기/집계하는 로직

문제점

  1. MemberService God Class — 회원 관리 + 풀이 인증 + 풀이 통계 + 이메일 변경 + 핸들 등록, 의존성 8개 주입
  2. assignRanks() 코드 중복RankingServiceTeamActivityService에 완전히 동일한 순위 부여 로직
  3. TeamActivityService가 Repository 직접 접근MemberSolvedProblemRepository를 직접 주입받아 풀이 데이터를 조회

solve 도메인 구성

solve/
├── domain/
│   └── MemberSolvedProblem.java        ← member에서 이동
├── repository/
│   └── MemberSolvedProblemRepository.java  ← member에서 이동
├── service/
│   ├── SolveService.java               ← 문제해결 인증 + 일별 풀이 현황 + 풀이 상태 조회
│   └── RankingService.java             ← 전체 랭킹 (member에서 이동) + assignRanks 통합
├── dto/
│   ├── request/
│   └── response/
│       ├── DailySolvedResponse.java    ← member에서 이동
│       └── GlobalRankingResponse.java  ← member에서 이동
└── SolveController.java

solve에 포함하지 않는 것

  • TeamActivityService — 풀이 데이터의 소비자이지 소유자가 아님. team에 유지하되 solve 서비스를 호출하는 조정자 역할

작업 항목

  • solve 패키지 생성
  • MemberSolvedProblem 엔티티 + MemberSolvedProblemRepository → solve로 이동
  • MemberService.verifyProblemSolved()SolveService로 이동
  • MemberService.getDailySolved()SolveService로 이동
  • RankingService → solve로 이동
  • DailySolvedResponse, GlobalRankingResponse 등 관련 DTO 이동
  • SolveController 생성 (기존 MemberController의 풀이 관련 엔드포인트 이동)
  • 기존 테스트 이동 및 수정

후속 작업 (별도 이슈)

  • TeamActivityServiceSolveService/RankingService 호출로 전환 (Repository 직접 접근 제거)
  • assignRanks() 중복 제거 — 공통 인터페이스 도입

기대 효과

  • MemberService God Class 해소 (의존성 8개 → 4~5개)
  • "풀이"라는 관심사가 한 곳에 응집

관련 이슈

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    Status

    Done

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions