[TYPESCRIPT] Partial, Pick, Omit, Required 유틸리티 타입 활용 — 실무에서 가장 많이 쓰이는 타입 변환 패턴

TypeScript는 객체 타입을 손쉽게 변환할 수 있도록 다양한 유틸리티 타입을 제공합니다. 그 중에서도 가장 많이 사용되는 네 가지는 Partial, Pick, Omit, Required입니다. 이들은 Mapped Type을 기반으로 하며, 도메인 객체 → DTO → API 응답 타입 변환과 같은 작업에서 특히 강력합니다.

 

Partial — 모든 속성을 optional로 변환

Partial은 객체 타입의 모든 속성을 optional(?)로 변경합니다.

type User = {
  id: number;
  name: string;
  email: string;
};

type PartialUser = Partial<User>;
// { id?: number; name?: string; email?: string }

주로 업데이트 요청 DTO와 같이 부분 수정이 가능한 경우에 활용됩니다.

function updateUser(id: number, data: Partial<User>) {
  // 필요한 필드만 넘겨도 OK
}

 

Pick — 특정 속성만 선택

Pick은 기존 타입에서 원하는 속성만 골라 새 타입을 생성할 때 사용합니다.

type UserProfile = Pick<User, "id" | "name">;
// { id: number; name: string }

다음 상황에서 특히 유용합니다:

  • 목록 조회용 DTO (민감 정보 제외)
  • 간단한 요약용 데이터 구조

 

Omit — 특정 속성만 제외

Omit은 Pick과 반대로, 특정 속성만 제거하여 타입을 구성합니다.

type UserWithoutEmail = Omit<User, "email">;
// { id: number; name: string }

API 요청/응답 설계 시 자주 등장하는 패턴입니다:

  • Entity에는 있지만 클라이언트에 보내면 안 되는 필드 제거
  • 비밀번호·토큰·관리자 필드 등 보안 관련 데이터 차단

 

Required — 모든 속성을 필수로 변경

Required는 기존 타입의 모든 optional 속성을 필수 속성으로 변환합니다.

type UserOptional = {
  id?: number;
  name?: string;
};

type StrictUser = Required<UserOptional>
// { id: number; name: string }

다음처럼 “저장 직전 검증 단계”에서 유용합니다:

function save(user: Required<UserOptional>) {
  // id, name 둘 다 반드시 존재해야 함
}

 

4가지 유틸리티 타입 비교 요약

유틸리티 타입 설명 사용 예
Partial<T> 모든 속성을 optional로 변경 업데이트용 DTO
Pick<T, K> 원하는 속성만 선택 목록 조회, 간단 출력 모델
Omit<T, K> 원하는 속성만 제외 민감 데이터 제거
Required<T> 모든 속성을 필수로 변경 저장 전 최종 검증

 

실무에서 자주 쓰는 응용 패턴

Partial + Required 조합

type UpdateUserPayload = Partial<User> & Required<Pick<User, "id">>;

→ id는 필수, 나머지는 선택적으로 업데이트 가능

Pick + Partial 조합

type ProfileUpdate = Partial<Pick<User, "name" | "email">>;

→ 일부 필드만 수정 가능한 업데이트 폼

Omit을 이용해 보안 필드 제거

type PublicUser = Omit<User, "password" | "token">;

→ API 응답용으로 적합

 


 

Partial, Pick, Omit, Required는 단순한 편의 기능이 아닌 타입 유효성 검증 및 레이어 간 DTO 변환을 자동화하는 핵심 도구입니다.

  • Partial → 부분 수정
  • Pick → 필요한 데이터만 선택
  • Omit → 불필요하거나 민감한 데이터 제거
  • Required → 반드시 있어야 하는 정보 강제

이 네 가지를 정확히 이해하면 실제 서비스에서 Entity → DTO → Response → Request 흐름을 타입 레벨에서 안전하게 관리할 수 있습니다.