Enum Type (@Enumerated, EnumType)

6523 단어 JPAJPA

🔎 JPA가 ENUM 타입을 매핑시키는 방법

JPAEnum 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 = 0
  • USER = 1
  • GUEST = 2

이렇기 때문에 위 예제에서 RoleType.ADMIN을 저장했을 때 DB에 0이 저장된 것 입니다.

이런 상황을 가정해볼께요.

요구사항이 변경되어 RoleTypeVIP가 0번째에 추가되는 상황입니다.

public enum RoleType {
        VIP, ADMIN, USER, GUEST
}

이렇게 Enum 클래스를 변경하고 VIPRoleType으로 하는 Member를 추가시켜볼께요.

DB의 ROLETYPE 칼럼의 값이 중복되었습니다.
상수로 ENUM타입을 저장하면 이와 같이 변경시 오류의 가능성이 생깁니다.

때문에 반드시 ENUM 타입을 String으로 저장해주어야 합니다.

@Enumerated(EnumType.STRING)
private RoleType roleType;

위와 같이 EnumType.STRING으로 설정하고 아까 오류가 발생했던 시나리오를 똑같이 다시 수행해볼께요.

내부적으로 EnumType의 순서는 바뀌었지만 문제 없습니다. 순서 값인 상수를 이용하지 않고 STRING을 이용했으니까요.

📌 EnumType.STRING 권장.. !

@Enumerated(EnumType.STRING)

감사합니다. 😄

좋은 웹페이지 즐겨찾기