MySQL에서 Boolean과 Enum 사용에 대한 고찰
Boolean 타입
MySQL에는 BOOLEAN이라는 타입 자체가 존재하지 않는다.
MySQL :: MySQL 8.4 Reference Manual :: 13 Data Types
MySQL supports SQL data types in several categories: numeric types, date and time types, string (character and byte) types, spatial types, and the JSON data type. This chapter provides an overview and more detailed description of the properties of the type
dev.mysql.com
그렇다면 MySQL에서 Boolean을 어떻게 사용할 수 있을까?
MySQL은 0과 1이라는 숫자를 Boolean처럼 처리할 수 있도록 지원한다.
BIT vs TINYINT
Boolean 값을 저장하기 위해 BIT와 TINYINT를 선택할 수 있지만, MySQL 공식 문서와 실무 경험에 따르면 TINYINT(1) 사용을 권장한다.


1. 가독성
- TINYINT 조회
- BIT 조회
BIT 컬럼은 숫자로 변환해야 읽기가 편하다.
2. 성능
- 일반적으로 TINYINT가 인덱싱 및 조회 시 BIT보다 유리하다.
3. 프로그래밍 언어 호환성
- BIT 컬럼은 일부 언어에서 변환 과정을 거쳐야 할 수도 있다.
- TINYINT는 대부분의 언어에서 Boolean과 호환이 쉽다.
4. 저장 공간
- 일반적인 상식과 달리 BIT(1)과 TINYINT(1)의 저장공간은 차이가 없다.
- BIT(1)와 TINYINT(1)은 모두 1바이트를 사용한다.
- 아래 사진과 같이 BIT(1) 또한 (1+7)/8 바이트를 사용하게 된다.

MySQL :: MySQL 8.0 Reference Manual :: 13.7 Data Type Storage Requirements
13.7 Data Type Storage Requirements The storage requirements for table data on disk depend on several factors. Different storage engines represent data types and store raw data differently. Table data might be compressed, either for a column or an entire
dev.mysql.com
- CPU와 같은 하드웨어는 1bit 단위로 IO를 처리할 수 없기 때문에 BIT가 1bit만 차지하지 않는다.
JPA에서 Boolean


- JPA/Hibernate에서 boolean 타입을 매핑하면 MySQL에서는 기본적으로 BIT로 생성될 수 있다.
- 즉, TINYINT(1)으로 매핑하도록 DDL을 직접 작성하거나 확인하는 것이 좋다.
CREATE TABLE user (
id BIGINT NOT NULL,
is_deleted TINYINT(1) NOT NULL,
PRIMARY KEY (id)
);
Boolean vs Enum
TINYINT(1)은 단순히 0과 1을 허용하는 것을 넘어, 실수로 다른 값이 들어갈 수도 있다.
따라서 상태가 명확한 경우 Boolean을 쓰되, 상태가 확장될 가능성이 있는 경우에는 Enum을 사용하는 것이 좋다.
Enum 사용 장점
- "Y", "N" 등 명시적인 상태 표현 가능
- 상태가 추가되더라도 SRP 원칙을 지키며 확장 가능
- 코드 가독성 및 유지보수성 향상
Stack Overflow - Boolean vs Enum
Software Engineering SE - Boolean parameter design
결론
- 단순 true/false만 존재하고 확장 가능성이 없다면 → TINYINT(1) 사용, 필요 시 DB에 CHECK (is_deleted IN (0,1)) 제약 추가.
- 상태가 여러 가지로 확장될 가능성이 있거나 의미를 명확히 하고 싶다면 → Enum 사용.
Boolean과 Enum은 상황에 맞게 선택하고, JPA/Hibernate를 사용할 경우 DB 매핑이 원하는 타입으로 되었는지 확인하는 것이 중요하다.
'DB > MySQL' 카테고리의 다른 글
| [MySQL] DETERMINISTIC vs NOT DETEMINISTIC (0) | 2025.10.11 |
|---|---|
| [MySQL] VARCHAR vs TEXT (0) | 2025.10.11 |
| [MySQL] CHAR vs VARCHAR 타입 선정 (0) | 2025.10.11 |
| [MySQL] Spatial Query Index 최적화(공간 쿼리 최적화) (1) | 2025.08.31 |
| [MySQL] DATE 자료형 정리 (3) | 2024.11.20 |