Skip to content

[Refactor] Repository 패턴 도입으로 데이터 접근 로직 추상화 #95

Description

@l2juhan

📋 개요

데이터 접근 로직을 추상화하여 테스트 용이성유지보수성을 향상시키는 Repository 패턴 도입을 제안합니다.

🔍 현재 문제점

1. 구체적인 구현체에 직접 의존

// useFetchWorkplaces.ts
import { getWorkplaces } from "../../../api/employerApi";

const response = await getWorkplaces();  // API에 직접 의존

2. 발생하는 문제들

  • 테스트 어려움: API 테스트 시 vi.mock()으로 모킹 필요
  • 교체 어려움: 데이터 소스(API → 캐시/로컬 스토리지) 변경 시 훅 코드 직접 수정 필요
  • DIP 위반: 고수준 모듈(훅)이 저수준 모듈(API)에 직접 의존

✅ 제안하는 해결책

Repository 인터페이스 정의

// src/repositories/employer.repository.ts
export interface EmployerRepository {
  fetchWorkplaces(): Promise<Workplace[]>;
  fetchWorkersByWorkplace(id: number): Promise<ContractWorker[]>;
  fetchWorkRecords(workplaceId: number, start: Date, end: Date): Promise<WorkRecord[]>;
}

구현체 작성

// src/repositories/impl/apiEmployer.repository.ts
export class ApiEmployerRepository implements EmployerRepository {
  async fetchWorkplaces(): Promise<Workplace[]> {
    const response = await getWorkplaces();
    return response.data || [];
  }
  // ...
}

훅에서 의존성 주입

export function useFetchWorkplaces(
  repository: EmployerRepository = new ApiEmployerRepository()
) {
  const workplaces = await repository.fetchWorkplaces();
}

테스트 시 Mock 주입

const mockRepo: EmployerRepository = {
  fetchWorkplaces: () => Promise.resolve([mockWorkplace])
};
useFetchWorkplaces(mockRepo);  // vi.mock() 불필요

📁 영향 받는 파일

  • src/hooks/employer/useEmployerRemittanceData/useFetchWorkplaces.ts
  • src/hooks/employer/useEmployerRemittanceData/useFetchWorkers.ts
  • src/hooks/employer/useEmployerRemittanceData/useFetchWorkRecords.ts
  • src/hooks/worker/useRemittanceData.ts

🎯 기대 효과

현재 적용 후
API 모킹 필요 Mock 객체 주입으로 간단한 테스트
API 변경 시 훅 수정 Repository 구현체만 수정
단일 데이터 소스 캐시, 로컬 스토리지 등 교체 용이

🏷️ 참고

  • 코드 리뷰 보고서의 "낮은 우선순위" 항목으로 분류됨
  • 프로젝트 규모가 커지거나 테스트가 복잡해질 때 도입 권장

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions