에러 상황
Spring Boot + JPA 환경에서 회원가입 기능 구현 중 다음과 같은 에러가 발생했습니다.
SQL Error: 1265, SQLState: 01000
Data truncated for column 'role' at row 1
원인 분석
1. 엔티티 코드
@Entity
@Table(name = "p_user")
public class User extends BaseEntity {
@Enumerated(EnumType.STRING)
@Column(nullable = false) // length 속성 없음
private UserRole role = UserRole.USER;
}
2. Enum 정의
public enum UserRole {
USER("사용자"),
OWNER("오너"),
ADMIN("관리자"),
MANAGER("매니저");
}
3. 문제의 핵심
@Enumerated(EnumType.STRING)을 사용할 때 @Column에 length 속성을 명시하지 않으면, Hibernate가 테이블을 자동 생성할 때 기본값으로 작은 크기의 VARCHAR를 생성합니다.
실제 생성된 컬럼 크기가 너무 작아서 "OWNER", "MANAGER" 같은 값을 저장할 수 없었던 것입니다.
해결 방법
방법 1: 엔티티 수정 (권장)
@Entity
@Table(name = "p_user")
public class User extends BaseEntity {
@Enumerated(EnumType.STRING)
@Column(nullable = false, length = 50) // length 명시
private UserRole role = UserRole.USER;
@Enumerated(EnumType.STRING)
@Column(nullable = false, length = 50) // 다른 Enum도 동일하게
private UserStatus status = UserStatus.ACTIVE;
}
방법 2: SQL로 직접 수정
-- 컬럼 크기 확인
SHOW COLUMNS FROM p_user LIKE 'role';
-- 컬럼 크기 변경
ALTER TABLE p_user MODIFY COLUMN role VARCHAR(50);
ALTER TABLE p_user MODIFY COLUMN status VARCHAR(50);
방법 3: 테이블 재생성
개발 초기 단계라면:
-- 테이블 삭제
DROP TABLE IF EXISTS p_user;
그 후 엔티티에 length 속성을 추가하고 서버를 재시작하면 올바른 크기로 재생성됩니다.
예방 방법
1. Enum 컬럼에는 항상 length 명시
@Enumerated(EnumType.STRING)
@Column(length = 50) // 충분한 크기 지정
private UserRole role;
2. DB 생성 전략 확인
# application.yml
spring:
jpa:
hibernate:
ddl-auto: validate # 운영 환경
# ddl-auto: update # 개발 환경
show-sql: true # SQL 로그 확인
3. 테이블 생성 후 검증
-- 테이블 구조 확인
DESC p_user;
-- 또는
SHOW CREATE TABLE p_user;
핵심 정리
- @Enumerated(EnumType.STRING) 사용 시 반드시 length 속성 명시
- Enum 값의 최대 길이를 고려하여 충분한 크기 할당
- 개발 단계에서 생성된 테이블 구조를 반드시 검증
- 가능하면 Flyway, Liquibase 같은 마이그레이션 도구 사용 권장
참고
- Hibernate 기본 VARCHAR 크기는 버전과 설정에 따라 다를 수 있음
- EnumType.ORDINAL 사용 시 이 문제는 발생하지 않지만, Enum 순서 변경 시 데이터 정합성 문제 발생 가능
- 운영 환경에서는 ddl-auto: validate를 사용하고, 스키마 변경은 마이그레이션 스크립트로 관리하는 것이 안전
'Spring 단기심화 프로젝트' 카테고리의 다른 글
| 배달 플랫폼 데이터베이스 PK 전략: 실무 중심 설계 과정 (0) | 2025.09.29 |
|---|