[JPA]PostgreSQL 사용시, 엔티티에 Enum 매핑 오류Back-End/JPA2024. 11. 21. 17:09
Table of Contents
개발 환경
- SpringBoot 3.3.5
- Java 17
- PostgreSQL 14
문제 상황
ERROR: column "XXX" is of type XXX but expression is of type character varying Hint: You will need to rewrite or cast the expression.
@Enumerated(EnumType.STRING)
@Column(nullable = false, name = "level")
private UserLevel level;
엔티티에 ENUM 타입이 있는데 이를 enum이 아닌 문자열로 인식해서 발생하는 문제임을 알았다.
XXX(예시) 라는 컬럼이 있는데, PostgreSQL에서는 ENUM으로 만들었지만, JPA에서 이를 문자열로 인식한 상황이다.
MySQL을 사용할 때는 이런일이 전혀 발생하지 않았기 때문에 매우 당황했다.
하지만 폭풍 구글링으로 문제를 해결할 수 있었다.
문제 해결
@Enumerated(EnumType.STRING)
@Column(nullable = false, name = "level", columnDefinition = "level")
@JdbcTypeCode(SqlTypes.NAMED_ENUM)
private UserLevel level;
@column 애노테이션의 columnDefinition에 컬럼이름을 명시해주고, 이 컬럼이 ENUM 타입이라는 것을 명시해주는 @JdbcTypeCode(SqlTypes.NAMED_ENUM) 애노테이션을 추가해주어서 해결하였다.
문제를 정리하자면 자바의 ENUM 타입을 JPA가 자동으로 인지하지 못하기 때문에 오류가 발생한 것이고, 만약 데이터베이스에서 Enum 타입을 직접 정의하고, 그 타입의 이름이 level이라면 @Column의 columnDefinition 속성에 level 타입을 명시해야 한다.
이는 데이터베이스에서 해당 컬럼이 level이라는 사용자 정의 타입을 사용할 수 있도록 명시적으로 설정하는 과정이라고 한다.
@JdbcTypeCode(SqlTypes.NAMED_ENUM)는 Hibernate 6.0부터 도입된 방식으로, 데이터베이스의 사용자 정의 ENUM 타입을 JPA 엔티티와 매핑하기 위해 사용되는 애노테이션이다.
이 애노테이션은 Hibernate가 데이터베이스의 명명된 Enum 타입(NAMED ENUM)을 인식하도록 설정한다고 한다.
오늘도 하나 배웠다~
'Back-End > JPA' 카테고리의 다른 글
[Spring Data JPA] Projections 과 Native Query (0) | 2024.08.16 |
---|---|
[Spring Data JPA] 새로운 엔티티인지 구별하는 방법 (0) | 2024.08.15 |
[Spring Data JPA] 확장 기능 (0) | 2024.08.14 |
[Spring Data JPA] 쿼리 메서드 기능 (0) | 2024.08.13 |
[Spring Data JPA] Spring Data JPA (0) | 2024.08.12 |