1. ENUM 데이터 타입 개요
ENUM 데이터 타입이란?
MySQL ENUM(열거형) 데이터 타입은 미리 정의된 목록에서 정확히 하나의 값만 저장합니다. 목록에 정의된 특정 문자열만 컬럼에 저장될 수 있기 때문에 데이터 일관성을 유지하고 잘못된 데이터 입력을 방지합니다.
예를 들어, 사용자가 성별이나 제품 카테고리와 같이 제한된 집합 중 하나를 선택해야 할 때 ENUM을 사용하면 불필요한 검증 절차가 필요 없게 됩니다. 아래는 ENUM 컬럼을 포함한 테이블을 생성하는 예시입니다:
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
category ENUM('Food', 'Clothing', 'Electronics', 'Furniture') NOT NULL
);
이 예시에서 “category” 컬럼은 “Food”, “Clothing”, “Electronics”, “Furniture” 네 가지 값 중 하나만 저장할 수 있습니다. 이는 데이터 관리를 단순화하고 잘못된 입력 위험을 줄여줍니다.
ENUM의 주요 사용 사례
- 상태 관리 : “시작 전”, “진행 중”, “완료”와 같은 프로젝트 진행 상태를 열거합니다.
- 분류 : 제품, 사용자 유형, 직무 역할 등 사전 정의된 카테고리 옵션을 관리합니다.
- 랭킹 : 게임 난이도 수준(“초보”, “중급”, “고급”) 또는 제품 평점(“좋음”, “보통”, “나쁨”)을 나타냅니다.
2. ENUM의 장점과 단점
장점
- 데이터 무결성 향상 ENUM을 사용하면 미리 정의된 목록에 포함된 값만 저장할 수 있어 데이터 일관성을 보장하고 관리가 쉬워집니다. 예를 들어 성별을 관리할 때 “Male” 또는 “Female”과 같은 특정 값만 허용되어 잘못된 입력을 방지합니다.
- 저장 효율성 각 ENUM 값은 내부적으로 정수 인덱스를 할당받아 정수 형태로 저장됩니다. VARCHAR와 비교하면 저장 용량이 감소합니다. 예를 들어 ‘small’이나 ‘large’와 같은 크기 정보를 VARCHAR로 저장하면 더 많은 공간을 차지하지만, ENUM으로 정의하면 보다 효율적으로 저장할 수 있습니다.
단점
- 유연성 부족 ENUM은 미리 정의된 값만 허용하므로 새로운 값을 추가하려면 테이블 구조를 변경해야 합니다. 따라서 옵션이 자주 동적으로 변하는 상황에는 적합하지 않습니다.
- 복잡한 오류 처리 잘못된 값이 삽입되면 오류가 발생하거나 빈 문자열이 저장될 수 있습니다. 이러한 동작은 개발자의 디버깅을 복잡하게 만들 수 있습니다.
3. ENUM 구성 및 사용 예시
기본 설정 및 오류 처리
ENUM 데이터 타입을 설정하는 것은 허용할 문자열 목록을 지정하는 것만으로 간단합니다. 아래는 테이블에서 ENUM 컬럼을 정의하는 예시입니다:
CREATE TABLE shirts (
id INT AUTO_INCREMENT PRIMARY KEY,
size ENUM('XS', 'S', 'M', 'L', 'XL') NOT NULL
);
이 경우 “size” 컬럼은 “XS”, “S”, “M”, “L”, “XL” 다섯 가지 값 중 하나만 저장할 수 있습니다. 목록에 포함되지 않은 값을 삽입하려고 하면(예: ‘XXL’) Data truncated 오류가 발생합니다. 이는 미리 정의된 목록 외의 값이 저장되는 것을 방지하고 데이터 일관성을 유지하는 데 도움이 됩니다.
실용 예시
다음은 ENUM을 사용하여 사용자 역할(“Administrator”, “Regular User”, “Guest”)을 관리하는 예시입니다:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
role ENUM('Administrator', 'Regular User', 'Guest') NOT NULL
);
역할에 따라 서로 다른 권한을 부여할 때 ENUM 컬럼을 사용하면 데이터 무결성을 유지하기가 더 쉬워집니다. 
4. ENUM 인덱스 및 NULL 처리
인덱스 값 사용
각 ENUM 값은 목록에서의 위치에 따라 1부터 시작하는 숫자 인덱스를 부여받습니다. 예를 들어, 다음과 같은 크기 정보를 저장하는 ENUM 컬럼을 살펴보세요:
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
size ENUM('S', 'M', 'L', 'XL')
);
“S”는 인덱스 1, “M”은 인덱스 2와 같이 할당됩니다. 이러한 인덱스 값은 WHERE 절에서 효율적인 데이터 작업을 위해 사용할 수도 있습니다.
SELECT * FROM products WHERE size = 2;
이 쿼리는 size가 “M”인 레코드를 검색합니다.
NULL 및 빈 문자열 처리
ENUM 컬럼에서 NULL이 허용되는 경우, 미리 정의된 목록에 포함되지 않더라도 NULL 값을 저장할 수 있습니다. 또한, 잘못된 데이터가 삽입되어 빈 문자열로 변환되면 인덱스 0으로 저장됩니다. 이러한 동작을 통해 잘못된 입력을 감지할 수 있습니다.
5. ENUM의 문자 집합 및 정렬 규칙
문자 집합 및 정렬 규칙 설정 방법
CHAR와 VARCHAR와 마찬가지로, ENUM 데이터 타입은 문자 집합과 정렬 규칙을 지정할 수 있습니다. 이는 다국어 시스템을 구축하거나 정렬 규칙에 따라 검색을 수행할 때 특히 중요합니다. 아래는 예시입니다:
CREATE TABLE documents (
id INT AUTO_INCREMENT PRIMARY KEY,
language ENUM('Japanese', 'English', 'Chinese') CHARACTER SET utf8 COLLATE utf8_general_ci
);
이 예시에서는 UTF-8 문자 집합과 일반 정렬 규칙이 지정되었습니다.
6. ENUM의 확장성 및 대안
ENUM 확장 전략
ENUM은 임의의 값을 저장하는 유연성이 부족하기 때문에 동적으로 변하는 데이터에 적합하지 않습니다. 한 가지 방법은 “Other” 옵션을 추가하고 별도의 자유 텍스트 컬럼을 제공하는 것입니다:
ALTER TABLE products
MODIFY COLUMN category ENUM('Food', 'Clothing', 'Electronics', 'Furniture', 'Other') NOT NULL,
ADD COLUMN category_other VARCHAR(255) DEFAULT NULL;
이렇게 하면 ENUM 목록에 포함되지 않은 값들을 별도의 VARCHAR 컬럼에 저장할 수 있어 필요할 때 동적으로 처리할 수 있습니다.
대안으로 SET 또는 VARCHAR 사용
ENUM의 대안으로는 SET 데이터 타입(다중 선택 가능)이나 보다 유연한 VARCHAR 데이터 타입을 애플리케이션 요구 사항에 따라 고려할 수 있습니다.


