DB

[MySQL] SELECT와 ENUM 컬럼을 활용한 데이터 정합성 및 조회 최적화 전략

인생아 2025. 6. 30. 13:25
반응형

MySQL에서 고정된 값들 중 하나만 저장해야 할 컬럼이 있을 때 ENUM 타입은 매우 유용한 데이터 타입이다. 특히 사용자 상태, 주문 상태, 결제 수단, 성별 등 정해진 값의 목록이 있을 경우 ENUM을 활용하면 데이터 무결성 유지, 공간 절약, 쿼리 간결화에 큰 이점을 제공한다.

✅ ENUM이란?

ENUM은 미리 정의한 문자열 목록 중 하나를 저장할 수 있는 데이터 타입이다. 내부적으로는 해당 값의 순서 인덱스(integer) 값으로 저장되어, 저장 공간이 작고 정렬 성능이 좋다.

기본 문법

CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    status ENUM('active', 'inactive', 'pending')
);

이 테이블의 status 컬럼은 'active', 'inactive', 'pending' 중 하나의 값만 가질 수 있다.

반응형

✅ ENUM 컬럼 SELECT 조회 예제

가장 기본적인 SELECT 문이다.

SELECT name, status
FROM users
WHERE status = 'active';

ENUM 타입은 문자열로 비교가 가능하므로 일반적인 조건절에 사용할 수 있다.

✅ ENUM의 인덱스(정수값)로 조회하기

MySQL 내부에서는 ENUM('active', 'inactive', 'pending')을 각각 1, 2, 3으로 저장한다.

SELECT name, status
FROM users
WHERE status = 1;

이렇게 정수값으로도 비교가 가능하지만, 가독성이 떨어지므로 문자열을 사용하는 것이 권장된다.

✅ 정렬 시 자동으로 정의 순서대로 정렬된다

SELECT name, status
FROM users
ORDER BY status;

위 쿼리는 'active' → 'inactive' → 'pending' 순으로 정렬된다. 일반 문자열 타입이라면 알파벳 순서로 정렬되지만, ENUM은 정의된 순서대로 정렬되므로 비즈니스 로직에 맞춘 정렬이 가능하다.

✅ ENUM과 CASE 문을 활용한 보기 좋은 출력

SELECT name,
       CASE status
         WHEN 'active' THEN '활성 사용자'
         WHEN 'inactive' THEN '비활성 사용자'
         WHEN 'pending' THEN '승인 대기 중'
       END AS status_ko
FROM users;

ENUM 컬럼을 그대로 사용할 수도 있지만, CASE 문을 이용해 출력 메시지를 한국어로 바꾸면 사용자 인터페이스에도 유리하다.

반응형

✅ ENUM 활용 예제: 주문 상태 관리

CREATE TABLE orders (
    id INT PRIMARY KEY,
    user_id INT,
    order_status ENUM('결제대기', '결제완료', '배송중', '배송완료', '취소')
);

특정 상태 주문 조회

SELECT *
FROM orders
WHERE order_status = '배송중';

복수 상태 조건

SELECT *
FROM orders
WHERE order_status IN ('배송중', '배송완료');

✅ ENUM의 장점 정리

장점 설명
데이터 무결성 보장 허용된 값 외에는 입력 불가
공간 절약 내부적으로 정수로 저장됨
정렬 편의성 정의한 순서대로 정렬됨
가독성 높은 SELECT 쿼리 문자열 조건 사용 가능
 

✅ ENUM 사용 시 주의사항

  • ENUM 값 변경은 ALTER TABLE을 사용해야 하므로 수정이 자주 필요한 필드는 ENUM보다 별도 테이블 참조가 유리하다.
  • NULL도 ENUM 값에 포함할 수 있지만, 명시적으로 넣어야 한다.
  • ENUM은 다국어 시스템이나 동적으로 상태가 바뀌는 구조에는 적합하지 않을 수 있다.

✅ 공식 문서 링크

반응형