오버로딩 제네릭 등

윤종성·2025년 4월 29일
0

유사한 로직의 메서드를 만들어야할 때 사용할 수 있는 방법

1. 메서드 분리

// 단일 항목 처리
async createOne(data: Data): Promise<Log> {
  return (await this.createMany([data]))[0];
}

// 다중 항목 처리
async createMany(datas: Data[]): Promise<Log[]> {
  // 구현 로직
}

장점

  • 단일 책임 원칙 준수: 각 메서드는 명확한 한 가지 목적을 가짐
  • 코드 가독성: 목적별로 구분되어 이해하기 쉬움
  • 확장성: 각 메서드에 특화된 기능 추가 용이
  • 테스트 용이성: 각 기능을 독립적으로 테스트하기 쉬움

단점

  • 메서드 수 증가: 더 많은 메서드명을 기억해야 함
  • 코드 중복 가능성: 재사용하지 않으면 로직 중복 발생
  • API 표면적 증가: 외부에 노출되는 메서드 증가

2. 오버로딩

// 오버로드 시그니처
async create(data: Data): Promise<Log>;
async create(data: Data[]): Promise<Log[]>;

// 실제 구현체
async create(data: Data | Data[]): Promise<Log | Log[]> {
  const dataArray = Array.isArray(data) ? data : [data];
  // 구현 로직...
  return Array.isArray(data) ? Log : Logs[0];
}

장점

  • 인터페이스 단순화: 사용자는 하나의 메서드명만 기억하면 됨
  • 타입 안전성: 컴파일러가 올바른 인자와 반환 타입 매칭을 보장
  • API 일관성: 단일/다중 작업에 동일한 메서드명 사용

단점

  • 구현 복잡성: 모든 케이스를 처리하는 하나의 함수 내에서 분기 처리 필요
  • 책임 혼합: 단일 메서드가 여러 역할 수행
  • 데이터 흐름 추적 어려움: 타입 분기로 인한 코드 복잡성 증가

3. 제네릭 사용

async create<T>(data: T): Promise<T> {
}

장점

  • 유연성과 재사용성
  • 다양한 타입에 대응할 수 있음
  • 타입 안전성

단점

  • 복잡한 제네릭 로직은 코드 이해도를 낮춤
  • 런타임 오류의 가능성
  • 오버로딩만큼 다양한 구성이 어려움
profile
알을 깬 개발자

0개의 댓글