본문 바로가기
Spring 단기심화 프로젝트

JPA @Enumerated 사용 시 Data truncated 에러 해결

by JuNo_12 2025. 10. 13.

에러 상황

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를 사용하고, 스키마 변경은 마이그레이션 스크립트로 관리하는 것이 안전