Jin's IT Story.

TypeScript 타입 설계 핵심 패턴 3가지 정리

| 2026-08-04
목차
    파란색 계열의 입체적이고 기하학적인 모듈식 블록들이 서로 정밀하게 연결되어 조화를 이루는 추상적인 테크 일러스트레이션으로, 체계적인 타입스크립트 패턴 설계를 시각화하고 있습니다.

    웹 개발을 하다 보면 "타입스크립트를 쓰는데 왜 내 코드는 여전히 에러투성일까?"라는 고민을 자주 마주하게 됩니다. 단순히 변수 뒤에 콜론을 붙이고 임시로 타입을 지정하는 수준을 넘어, 안정적이고 확장성 있는 코드를 작성하려면 체계적인 TypeScript 패턴 설계가 필요합니다. 타입을 올바르게 설계하는 것은 튼튼한 건축을 위해 정교한 설계도를 그리는 것과 같습니다. 잘 만들어진 타입 시스템은 런타임 에러를 사전에 차단하고 동료 개발자에게 친절한 안내서 역할을 해줍니다.

    타입 유틸리티로 중복 없는 도면 그리기

    처음 타입스크립트를 접하면 매번 새로운 인터페이스나 타입을 선언하느라 코드가 비대해지기 쉽습니다. 하지만 사용자 정보를 나타내는 기본 타입이 이미 존재할 때, 가입용 타입이나 정보 수정용 타입을 매번 따로 만드는 것은 비효율적입니다. 이때 필요한 것이 바로 내장 타입 유틸리티입니다. 이미 정의해 둔 타입을 마치 레고 블록처럼 유연하게 재사용하여 새로운 타입을 정의하는 마법 같은 도구입니다.

    가장 자주 쓰이는 Pick과 Omit은 기존 타입에서 필요한 필드만 쏙 골라내거나 특정 필드만 제외하고 가져올 수 있게 해줍니다. 예를 들어 전체 사용자 정보에서 이메일과 이름만 필요한 화면이 있다면, 새로운 인터페이스를 만들지 않고 Pick을 통해 기존 타입을 재활용할 수 있습니다. Partial을 사용하면 모든 속성을 선택 사항으로 바꾸어 프로필 수정처럼 일부 데이터만 입력받는 상황에 완벽하게 대응할 수 있습니다.

    Mapped Types로 변화무쌍한 속성 다루기

    만약 기존 타입의 모든 속성을 읽기 전용으로 바꾸거나, 모든 속성 뒤에 물음표를 붙여 선택적 속성으로 변경해야 한다면 어떻게 해야 할까요? 이럴 때 힘을 발휘하는 설계 기법이 바로 Mapped Types입니다. 이는 프로그래밍에서 배열을 순회하는 map 함수처럼, 타입 세계에서 기존 타입의 키들을 하나씩 순회하며 새로운 형태의 타입을 일괄적으로 정의하는 기술입니다.

    예를 들어 서비스의 설정 정보가 담긴 타입이 있다고 해봅시다. 앱 내부에서 이 설정값을 실수로 변경하지 못하도록 모든 속성을 읽기 전용으로 바꾸고 싶을 때 Mapped Types를 활용하면 단 몇 줄의 코드로 우아하게 해결할 수 있습니다. 기존 키들을 순회하면서 앞에 readonly 수식어를 붙여주는 방식으로 동작하기 때문에, 원본 타입에 새로운 설정 항목이 추가되더라도 자동으로 감지하여 반영해 줍니다. 이는 유지보수 생산성을 극대화하는 강력한 기법 중 하나입니다.

    제네릭과 조건부 타입으로 똑똑한 타입 설계하기

    더 나아가 상황에 따라 유연하게 변하는 타입을 설계하고 싶다면 제네릭과 조건부 타입을 조합해야 합니다. 제네릭은 타입을 미리 확정 짓지 않고 실제 사용할 때 파라미터처럼 전달받는 기법입니다. 자판기에 동전을 넣으면 음료가 나오고 지폐를 넣으면 더 큰 상품이 나오는 것처럼, 들어오는 데이터 종류에 따라 결과 타입이 동적으로 결정되는 구조를 만들 수 있습니다.

    여기에 "만약 이 타입이 A라면 B로 처리하고, 그렇지 않으면 C로 처리해라"라는 삼항 연산자 같은 논리를 더하는 조건부 타입을 결합하면 똑똑한 타입 엔진이 완성됩니다. 주로 API 응답 데이터가 성공일 때와 실패일 때 서로 다른 형태를 가져야 하는 동적 비즈니스 로직을 설계할 때 매우 유용합니다. 복잡해 보이는 구조도 결국 조건에 따른 분기 처리라는 쉬운 개념에서 출발한다는 것을 이해하면 한층 더 다루기 쉬워집니다.

    타입스크립트를 다루는 진정한 재미는 단순히 에러를 없애는 것을 넘어, 비즈니스 도메인 지식을 코드로 조화롭게 녹여내는 타입 설계에 있습니다. 오늘 살펴본 타입 유틸리티와 Mapped Types, 그리고 제네릭을 적절히 활용하면 중복 없고 유연한 코드를 작성할 수 있습니다. 처음에는 설계 과정이 낯설고 복잡해 보일 수 있지만, 하나씩 패턴을 적용해 나가다 보면 어느새 어떤 변화에도 흔들리지 않는 단단한 애플리케이션을 완성하게 될 것입니다.