📋 개요
데이터 접근 로직을 추상화하여 테스트 용이성과 유지보수성을 향상시키는 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 구현체만 수정 |
| 단일 데이터 소스 |
캐시, 로컬 스토리지 등 교체 용이 |
🏷️ 참고
- 코드 리뷰 보고서의 "낮은 우선순위" 항목으로 분류됨
- 프로젝트 규모가 커지거나 테스트가 복잡해질 때 도입 권장
📋 개요
데이터 접근 로직을 추상화하여 테스트 용이성과 유지보수성을 향상시키는 Repository 패턴 도입을 제안합니다.
🔍 현재 문제점
1. 구체적인 구현체에 직접 의존
2. 발생하는 문제들
vi.mock()으로 모킹 필요✅ 제안하는 해결책
Repository 인터페이스 정의
구현체 작성
훅에서 의존성 주입
테스트 시 Mock 주입
📁 영향 받는 파일
src/hooks/employer/useEmployerRemittanceData/useFetchWorkplaces.tssrc/hooks/employer/useEmployerRemittanceData/useFetchWorkers.tssrc/hooks/employer/useEmployerRemittanceData/useFetchWorkRecords.tssrc/hooks/worker/useRemittanceData.ts🎯 기대 효과
🏷️ 참고