Enum Type (@Enumerated, EnumType)
🔎 JPA가 ENUM 타입을 매핑시키는 방법
JPA
는 Enum Type
까지 DB로 매핑을 도와줍니다.
간단한 Enum Type
을 만들어보고 직접 매핑까지 해볼께요.
실습에 사용한 Entity
입니다.
편의를 위해 setter
까지 모두 열어주었습니다.
@Getter @Setter
@Entity
public class Member {
@Id
private Long id;
@Column(name = "name")
private String username;
@Enumerated
private RoleType roleType;
}
우선 Entity
로 Enum타입을 사용하고 싶다면 @Enumerated
어노테이션을 붙여줘야 합니다.
간단하게 작성한 Enum클래스 코드입니다.
package com.dhk.domain;
public enum RoleType {
ADMIN, USER, GUEST
}
다 작성하였으니 이제 DB에 직접 넣어볼께요.
Member member = new Member();
member.setId(1L);
member.setUsername("kim");
member.setRoleType(RoleType.ADMIN);
em.persist(member);
실행 전 DB의 Member 테이블은 비어있는 상태입니다.
정상적으로 insert
쿼리가 수행되어 DB에 원하는 값이 들어갔습니다.
🔎 주의
사실 Enum Type
을 사용하는데 크게 어려움은 없습니다.
하지만 하나 주의해야 할 사항이 있습니다.
위 실습코드에서 Entity
클래스를 구성할 때 Enum
타입을 지정하는 어노테이션인 @Enumerated
에 아무런 설정을 해주지 않았습니다.
이렇게 아무런 설정을 해주지 않았을 때 @Enumerated
의 디폴트 설정값은 EnumType.ORDINAL
입니다.
ORDINAL
은 ENUM 타입의 값을 상수로 저장합니다.
실습에 사용한 ENUM 클래스를 다시 보실께요.
package com.dhk.domain;
public enum RoleType {
ADMIN, USER, GUEST
}
EnumType.ORDINAL
을 사용할 때 실제 enum type의 값은
ADMIN
= 0USER
= 1GUEST
= 2
이렇기 때문에 위 예제에서 RoleType.ADMIN
을 저장했을 때 DB에 0이 저장된 것 입니다.
이런 상황을 가정해볼께요.
요구사항이 변경되어 RoleType
에 VIP
가 0번째에 추가되는 상황입니다.
public enum RoleType {
VIP, ADMIN, USER, GUEST
}
이렇게 Enum 클래스를 변경하고 VIP
를 RoleType
으로 하는 Member를 추가시켜볼께요.
DB의 ROLETYPE
칼럼의 값이 중복되었습니다.
상수로 ENUM타입을 저장하면 이와 같이 변경시 오류의 가능성이 생깁니다.
때문에 반드시 ENUM 타입을 String으로 저장해주어야 합니다.
@Enumerated(EnumType.STRING)
private RoleType roleType;
위와 같이 EnumType.STRING
으로 설정하고 아까 오류가 발생했던 시나리오를 똑같이 다시 수행해볼께요.
내부적으로 EnumType의 순서는 바뀌었지만 문제 없습니다. 순서 값인 상수를 이용하지 않고 STRING
을 이용했으니까요.
📌 EnumType.STRING 권장.. !
@Enumerated(EnumType.STRING)
감사합니다. 😄
Author And Source
이 문제에 관하여(Enum Type (@Enumerated, EnumType)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@dhk22/JPA-Enum-Type-Enumerated-EnumType저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)