사용자 정의 타입

AI
gemma-4-31b
작성자
익명
작성일
2026.08.01
조회수
2
버전
v1

사용자 정의 타입 (User-Defined Types, UDT)

사용자 정의 타입(User-Defined Types, UDT)이란 시스템이 기본적으로 제공하는 기본 데이터 타입(Primitive Type) 외에, 사용자가 자신의 비즈니스 도메인에 맞게 직접 정의하여 사용하는 데이터 타입을 말한다.

1. 개요

데이터베이스 관리 시스템(DBMS)이나 프로그래밍 언어는 정수(INT), 실수(FLOAT), 문자열(VARCHAR)과 같은 기본 타입을 제공한다. 하지만 현장의 데이터는 단순한 기본 타입만으로는 표현하기 어려운 복잡한 구조를 가진 경우가 많다. UDT는 이러한 한계를 극복하기 위해 여러 기본 타입을 조합하거나 제약 조건을 부여하여 새로운 타입을 생성하는 기능이다. 이를 통해 데이터의 의미를 명확히 하고 추상화 수준을 높여 유지보수성을 향상시킬 수 있다.

2. 타입의 분류

UDT는 구현 목적과 구조에 따라 여러 형태로 분류된다.

타입 주요 특징 지원 예시
열거형 (ENUM) 정해진 값들의 집합 중 하나를 선택하는 타입 PostgreSQL, MySQL, Java, C#
구조체/복합 타입 여러 개의 기본 타입을 묶어 하나의 단위로 취급하는 타입 PostgreSQL, Oracle, C, Go
도메인 타입 (Domain) 기본 타입에 특정 제약 조건(CHECK)을 추가한 타입 PostgreSQL, SQL Standard
객체 타입 (Object) 속성(Attribute)과 메서드(Method)를 함께 정의하는 타입 Oracle (Object-Relational)

3. 생성 방법

UDT 생성 방법은 사용하는 시스템에 따라 다르나, 일반적으로 CREATE TYPE 또는 typedef와 같은 선언문을 사용한다.

3.1 SQL 기반 정의 (PostgreSQL 예시)

-- 1. 열거형 타입 생성
CREATE TYPE order_status AS ENUM ('Pending', 'Shipped', 'Delivered', 'Cancelled');

-- 2. 복합 타입 생성 (주소 정보를 하나의 타입으로 정의)
CREATE TYPE address_type AS (
    city TEXT,
    street TEXT,
    zip_code VARCHAR(10)
);

-- 3. 도메인 타입 생성 (이메일 형식 제약 조건 추가)
CREATE DOMAIN email_type AS TEXT
CHECK (VALUE ~* '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$');

3.2 프로그래밍 언어 기반 정의 (TypeScript 예시)

// 타입 별칭(Type Alias)을 이용한 UDT 정의
type OrderStatus = 'Pending' | 'Shipped' | 'Delivered' | 'Cancelled';

interface Address {
    city: string;
    street: string;
    zipCode: string;
}

const myAddress: Address = {
    city: "Seoul",
    street: "Gangnam-daero",
    zipCode: "06000"
};

4. 타입 변경 및 삭제 방법

정의된 UDT는 비즈니스 요구사항에 따라 수정하거나 삭제해야 할 필요가 있다.

  • 타입 수정 (Modification):
    • 열거형의 경우 새로운 값을 추가하는 ALTER TYPE ... ADD VALUE 구문을 주로 사용한다.
    • 복합 타입의 구조 변경은 대부분의 DBMS에서 직접 지원하지 않으므로, 기존 타입을 삭제하고 재정의하거나 새로운 타입을 만들어 데이터를 마이그레이션해야 한다.
  • 타입 삭제 (Deletion):
    • DROP TYPE [타입명] 구문을 사용한다. 단, 해당 타입을 참조하고 있는 테이블이나 컬럼이 있을 경우 의존성(Dependency) 문제로 인해 삭제가 거부될 수 있으며, 이 경우 CASCADE 옵션을 사용하여 연쇄 삭제를 수행한다.

5. 활용 사례 및 이점

5.1 데이터 모델 비교 (적용 전 vs 후)

특정 사용자의 주소와 연락처를 저장하는 모델을 가정할 때의 차이는 다음과 같다.

[적용 전: 기본 타입 중심 모델] - user_city (VARCHAR) - user_street (VARCHAR) - user_zipcode (VARCHAR) - user_phone (VARCHAR) - user_email (VARCHAR) $\rightarrow$ 컬럼 수가 급증하며, 주소 관련 데이터가 흩어져 관리가 어렵다.

[적용 후: UDT 중심 모델] - user_address (address_type) - user_contact (contact_type) $\rightarrow$ 논리적 단위로 그룹화되어 스키마가 간결해지고, 타입 재사용이 가능하다.

5.2 산업군별 구체적 적용 사례

  • 금융업: 통화 단위(Currency)를 UDT로 정의하여 금액(Numeric)통화코드(ISO 4217)를 하나로 묶어 처리함으로써 환율 계산 시 오류를 방지한다.
  • 물류/유통: 배송 상태(Shipping Status)를 ENUM 타입으로 정의하여 '준비중 $\rightarrow$ 배송중 $\rightarrow$ 완료'의 정해진 상태 흐름 외의 잘못된 값이 입력되는 것을 원천 차단한다.
  • 지리정보시스템(GIS): 위도와 경도를 포함하는 Point 타입이나 Polygon 타입을 정의하여 공간 쿼리(Spatial Query)를 효율적으로 수행한다.

6. 주의사항 및 성능 고려사항

UDT는 강력한 도구이지만 설계 시 다음과 같은 트레이드-오프(Trade-off)와 제약사항을 고려해야 한다.

  1. 성능 오버헤드: 복합 타입의 경우 데이터를 읽고 쓸 때 직렬화/역직렬화 과정이 추가되어 기본 타입보다 약간의 성능 저하가 발생할 수 있다.
  2. 인덱싱 제약: 일부 DBMS에서는 UDT 컬럼에 대해 표준 B-Tree 인덱스를 생성하는 것이 제한적일 수 있으며, GIN이나 GiST와 같은 특수 인덱스를 별도로 설정해야 하는 번거로움이 있다.
  3. 호환성 및 이식성 문제: UDT는 표준 SQL 범위를 벗어나는 경우가 많아, 다른 DBMS로 데이터를 이전(Migration)할 때 타입 변환 작업이 매우 까다롭거나 불가능할 수 있다.
  4. 학습 곡선 및 문서화 부담: 개발자가 기본 타입 외에 정의된 UDT의 구조를 별도로 학습해야 하므로, 협업 시 상세한 문서화가 필수적이다.
  5. 수정의 경직성: 한 번 정의되어 많은 테이블에서 참조되는 UDT의 구조를 변경하려면, 참조하는 모든 객체를 수정해야 하는 연쇄적인 작업이 필요하여 스키마 변경 비용이 높다.

7. 관련 개념

  • 추상 데이터 타입 (Abstract Data Type, ADT): 데이터의 내부 구현은 숨기고, 제공되는 연산(Operation)만을 정의한 수학적 모델이다. UDT는 ADT를 실제 시스템에서 구현한 형태라고 볼 수 있다.
  • 복합 타입 (Composite Type): 두 개 이상의 기본 타입을 결합하여 만든 타입으로, UDT의 가장 대표적인 형태이다.
  • 강타입 (Strong Typing): 변수의 타입이 엄격하게 정의되어, 타입이 맞지 않는 연산을 시도할 때 컴파일 단계나 실행 단계에서 오류를 발생시키는 특성이다. UDT를 사용하면 도메인별 강타입을 구현하여 런타임 오류를 줄일 수 있다.
AI 생성 콘텐츠 안내

이 문서는 AI 모델(gemma-4-31b)에 의해 생성된 콘텐츠입니다.

주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.

이 AI 생성 콘텐츠가 도움이 되었나요?