피드로 돌아가기
올리브영 타입스크립트로 알아보는 제네릭과 매개변수 다형성
올리브영 테크블로그올리브영 테크블로그
Frontend

올리브영 타입스크립트로 알아보는 제네릭과 매개변수 다형성

올리브영이 TypeScript 제네릭을 도입해 동일 로직의 반복 함수 3개를 1개로 통합하고 API 응답 타입 중복을 제거

2025년 12월 31일12intermediate

Context

올리브영 서비스에서 Product, Review, Order 등 서로 다른 타입들에 동일한 로직(목록의 첫 번째 요소 추출)을 적용해야 했으나, 서브타입 관계가 없어 함수를 각각 3개 작성해야 했습니다. 또한 모든 API 응답이 동일한 구조(data, status, message)를 가지고 있음에도 ProductResponse, UserResponse, OrderResponse 등 응답 타입을 개별적으로 정의해야 했습니다.

Technical Solution

  • 타입 변수 T를 사용한 제네릭 함수 구현: function getFirst<T>(items: T[]): T | undefined로 Product, Review, Order 타입의 배열에 동일하게 적용
  • 제네릭 인터페이스 생성: interface ApiResponse<T>를 정의해 모든 API 응답 타입을 ApiResponse<Product>, ApiResponse<User> 형태로 통합
  • 타입 인자 추론(Type Argument Inference) 활용: 컴파일러가 배열의 실제 타입에서 T를 자동으로 추론하여 명시적 타입 선언 제거
  • 제네릭 제약(Generic Constraints) 적용: function getLength<T extends HasLength>(arg: T)로 특정 속성이 있는 타입만 제약
  • Utility Types 활성화: Partial, Pick<T, K>, Omit<T, K>를 활용해 조건부 타입 생성

Impact

아티클에는 정량적 성능 수치(지연시간 감소, 처리량 증가 등)가 명시되지 않았습니다.

Key Takeaway

제네릭은 서브타입 관계 없는 완전히 독립적인 타입들에도 동일 로직을 적용할 수 있으며, any 타입과 달리 함수를 통과해도 타입 정보가 보존되어 타입 안전성을 유지합니다. 실무에서 API 응답 구조 같은 반복되는 타입 정의를 하나의 제네릭으로 통합하면 새로운 도메인 추가 시 기존 구현을 재사용할 수 있습니다.


TypeScript를 사용하는 프로젝트에서 여러 타입에 동일한 로직을 적용해야 할 때, 각 타입별 함수를 따로 만드는 대신 제네릭 함수를 사용하면 코드 중복을 제거하면서도 컴파일 시점의 타입 검사를 유지할 수 있습니다. 특히 API 응답 처리, 목록 조작 유틸리티(filter, map, find) 등 도메인별로 반복되는 데이터 구조에 제네릭 인터페이스를 적용하면 변경 시 한 곳만 수정해 모든 타입에 일괄 적용할 수 있습니다.

원문 읽기