could not execute query;
Out of range value for column
JPA를 사용하여 데이터를 Insert 하는 과정에서 발생한 Exception입니다.
'out of range value for column' 에러는 insert 하는 값이 해당 컬럼 데이터의 타입과 불일치하는 문제가 있을 때 발생합니다.
아래의 경우는 enum type을 사용하며 발생했습니다.
@Builder
@Getter
@AllArgsConstructor
@Entity
public class Transaction {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long idx;
private String tid;
private TransactionType type;
}
Transcation Class
enum class TransactionType {
DEPOSIT,
REMITTANCE,
CHARGE,
WITHDRAW
}
TransactionType Enum Class
위와 같은 Entity, Enum 상황에 DB에 type column은 varchar(255)로 되어 있는 경우였습니다.
.type(TransactionType.CHARGE)
빌더 패턴을 통해 객체를 생성하고 있었고, 다음과 같이 값을 넣어 저장하는 과정에서 예외가 발생하였습니다.
@Enumerated(EnumType.String)
private TransactionType type;
결론적으로 Enum type을 사용한 필드에 @Enumerated 어노테이션을 붙여 Exception을 해결하였습니다.
@Enumerated 어노테이션에는 두 가지 옵션이 있습니다.
- @Enumerated(EnumType.ORDINAL)
- @Enumerated(EnumType.STRING)
첫 번째 EnumType.ORDINAL을 사용할 경우 Enum class에 선언되어 있는 순서가 값이 됩니다.
즉, 위 예시의 Enum class로 본다면 DEPOSIT은 1, REMITTANCE는 2, CHARGE는 3, WITHDRAW는 4가 DB에 저장됩니다.
두 번째 EnumType.STRING을 사용하는 경우 해당 문자열 (DEPOSIT, REMITTANCE, CHARGE, WITHDRAW) 자체가 DB에 저장됩니다.
'out of range value for column' 이 발생한 이유는 @Enumerated 어노테이션의 default 옵션이 ORDINAL으로 설정되어, 해당 값이 int 형인 숫자로 들어갔기 때문에 varchar()으로 설정되어 있던 DB에서 예외가 발생한 것입니다.