Skip to content

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

@l2juhan

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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions