본문 바로가기
스프링/jpa

[fix] Enum 값 추가 시 발생하는 'Data truncated for column' 오류 해결 방법 (feat: AttributeConverter)

by 진믈리 2024. 11. 14.

 

상황

Enum에 새로운 상수를 추가해 주고, ddl-auto로 프로그램을 제 빌드 하였지만 추가된 enum 상수를 찾지 못하고 

java.sql.SQLException: Data truncated for column 에러가 발생했다.

 

이는 Hibernate6 부터 ddl-auto 기능이 기본적으로, 데이터베이스 스키마 일부만 업데이트 되도록 변경되었기 때문이다. 따라서 새로운 enum 상수를 추가해 주어도 스키마에 반영되지 않았다.


내용

test - enum, entity 생성

 

지금 상황에서는 animalType 테이블 구조를 살펴보면 Data Type에 CAT,DOG,LION 잘 저장된 것을 확인 할 수 있다.

 

하지만 여기서 AnimalType에 BIRD 를 추가한다면 어떻게 될까???

 

BIRD를 추가한 후 프로젝트를 다시 실행시켜 보았지만, 데이터베이스의 테이블 구조는 달라지지 않았다. 

 

 

따라서 api를 호출하여 BIRD를 저장하려 한다면

java.sql.SQLException: Data truncated for column 'animal_type' at row 1 에러가 발생하게 된다.


 

해결방법

해결방법으로는 AnimalType 메타데이터에 enum이 아닌 String 값을 저장해주고, 데이터베이스에서 값을 가져올때 String 값을 enum으로 변환해 주는 컨버터를 만드는 것이다.

 

AttributeConverter<> 을 구현한 AnimalConverter를 구현하여 엔티티에서 @Converter를 사용해주었다.

 

public class AnimalConverter implements AttributeConverter<AnimalType, String> {
    @Override
    public String convertToDatabaseColumn(AnimalType animalType) {
        return animalType != null ? animalType.name() : null;
    }

    @Override
    public AnimalType convertToEntityAttribute(String s) {
        return s != null ? AnimalType.valueOf(s) : null;
    }
}

 

@Entity
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Animal {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Convert(converter = AnimalConverter.class)
    private AnimalType animalType;
}

 

다시 프로젝트를 재 실행 해보니, Hibernate가 animal_type을 varchar로 변경해 주었다.

 


결과

'스프링 > jpa' 카테고리의 다른 글

영속성 컨텍스트란?  (0) 2024.09.14
User들의 권한 관계  (0) 2024.08.07
연관 관계를 무조건 맺는것이 좋을까?  (0) 2024.08.04