보통 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
상수명을 변경해야 한다면, 이런 문제가 발생할 수 있음을 인지해야 하겠다.