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 흐름을 타입 레벨에서 안전하게 관리할 수 있습니다.
'개발 > Typescript' 카테고리의 다른 글
| [TYPESCRIPT] Record, Exclude, Extract, NonNullable 정리 — 실무에서 자주 쓰는 타입 변환 도구 (0) | 2025.12.13 |
|---|---|
| [TYSCRIPT] 제네릭 제약조건(extends) 사용법 — 타입 안정성을 높이는 핵심 기법 (0) | 2025.12.10 |
| [TYPESCRIPT] 제네릭 함수와 클래스 활용하기 - 재사용성과 타입 안정성을 모두 잡는 방법 (0) | 2025.12.09 |
| [TYPESCRIPT] 제네릭(Generic) 기초 이해하기 - 타입을 입력받는 유연한 타입 설계 (0) | 2025.12.08 |
| [TYPESCRIPT] 컴파일러 옵션 정리 — strict, noImplicitAny 등 꼭 알아야 할 핵심 옵션 (0) | 2025.12.07 |
