[SpringDataJPA] JPA 사용 중 enum 관련하여 Table에 Insert 할 때 Check constraint violation: "CONSTRAINT_D: "; 가 발생하는 이슈

Denia·2023년 12월 23일
0

TroubleShooting

목록 보기
9/24

보통 Entity에서 enum 타입을 쓰게되면 @Enumerated(EnumType.STRING) 속성을 붙여서 사용한다.

@Entity
public class TestTable {
    @Id
    @GeneratedValue(strategy = jakarta.persistence.GenerationType.IDENTITY)
    private Long id;
    
    @Enumerated(EnumType.STRING)
    private EnumType enumType;
    
    private String description;
}

그런데 분명 enum에 들어있는 값을 사용하고 있는데도 테이블에 Insert할 때 Check constraint violation: "CONSTRAINT_D: "; 해당 에러가 뜨는 경우가 있다.

이 경우는 현재 Insert 하려는 테이블의 DDL을 보면 답을 알 수 있다.


테이블의 DDL을 보면 check가 들어가 있고 ENUM_TYPE으로 들어온 값을 다시 한번 확인하고 있다. (테이블 생성시에 사용한 enum 값을 토대로 constraint를 확인하는 것 같다.)

create table TEST_TABLE
(
    ID                  BIGINT auto_increment        primary key,
    ENUM_TYPE           CHARACTER VARYING(255),
    check ("ENUM_TYPE" IN ('TEST_A', 'TEST_B', 'TEST_C'))
);

만약 enum의 코드를 업데이트 했는데, 테이블의 DDL은 업데이트 하지 않았다면 계속해서 constraint violation가 발생할 것이다.

해당 이슈가 발생하게 된 계기는 다음과 같다.

혼자서 진행중인 토이 프로젝트 코드를 보다가 가독성 측면에서 기존 enum 상수명이 조금 별로라고 생각되어 enum 상수명을 다른 것으로 변경하게 되었다.

JPA에 의해서 enum 타입이 DB에 저장될 때 String으로 저장되는 것으로 알고 있어서 값을 바꾼다고 해도 큰 이슈가 발생하지 않을 줄 알았다. (기존에도 DB에 한번도 저장되지 않은 enum 상수명이었고, String으로 관리가 되니 상수명을 바꾼다고 해도 저장 및 조회에서 별다른 문제가 없을 줄 알았다.)

변경 후 테스트를 해보는데 자꾸 constraint violation이 발생했다.

나는 spring.jpa.hibernate.ddl-auto: update 로 설정을 해뒀어서, DDL 값이 변경되지 않았고 계속해서 특정 enum 상수명에 대해서만 constraint violation이 발생했다.

이런 부분에 대해서는 전혀 생각도 못하고 있었기에, 이게 실 서비스 환경이었으면 나의 무지로 인해서 큰 장애로 이어질 뻔 했다.

추후에 enum 상수명을 변경해야 한다면, 이런 문제가 발생할 수 있음을 인지해야 하겠다.

profile
HW -> FW -> Web

0개의 댓글