Skip to content

[REFACTOR] problem 도메인 Middleman 제거 및 데드 코드 정리 #156

@ryuwldnjs

Description

@ryuwldnjs

상위 이슈

요약

problem 도메인의 역할을 문제 메타데이터 저장소로 재정의하고, Middleman 안티패턴 및 데드 코드를 제거한다.

현재 문제점

1. ProblemService — Middleman 안티패턴

ProblemService의 4개 메서드가 전부 SolvedAcClient.recommendUnsolvedProblems()단순 위임만 수행. 자체 비즈니스 로직 없음.

// ProblemService.java — 모든 메서드가 이 패턴
public List<ProblemInfo> recommend(...) {
    return solvedAcClient.recommendUnsolvedProblems(...);
}

호출부 (2곳):

위치 사용 메서드
RecommendationCreator:89 recommend(handles, count, minLevel, maxLevel, tagKeys)
ProblemController:47,70 recommend(handle, count), recommend(request, count)

2. ProblemController 역할 의문

/api/problem/recommend 엔드포인트가 solved.ac API를 그대로 프록시할 뿐, 문제 메타데이터를 DB에 저장하지 않음. problem 도메인의 본래 책임("메타데이터 저장소")과 맞지 않음.

3. 데드 코드

파일 상태
TeamProblem.java 레거시 엔티티. 어디서도 import/사용되지 않음
TeamProblemRecommendResponse.java 레거시 DTO. 어디서도 import/사용되지 않음

해결 방안

Step 1: ProblemService 제거

  • RecommendationCreatorSolvedAcClient.recommendUnsolvedProblems() 직접 호출
  • ProblemControllerSolvedAcClient 직접 주입 (또는 엔드포인트 필요성 재검토)
  • ProblemService.java 삭제

Step 2: 데드 코드 삭제

  • TeamProblem.java 삭제
  • TeamProblemRecommendResponse.java 삭제

Step 3: problem 도메인 역할 재정의

리팩토링 후 problem 도메인 구성:

  • 엔티티: Problem, Tag, ProblemTag (문제 메타데이터)
  • 서비스: ProblemSyncService (solved.ac → 로컬 DB 동기화)
  • 레포지토리: ProblemRepository, TagRepository, ProblemTagRepository
  • 컨트롤러: ProblemController (직접 SolvedAcClient 사용, 또는 제거 검토)

난이도

쉬움 — 단순 삭제 + 호출부 변경 (2곳)

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