9. [JPA] @Enumerated

프로그래밍|2017. 8. 23. 13:46

자바 enum 타입을 엔티티 클래스의 속성으로 사용할 수 있다.

@Enumerated 애노테이션에는 두 가지 EnumType이 존재한다.

EnumType.ORDINAL : enum 순서 값을 DB에 저장
EnumType.STRING : enum 이름을 DB에 저장
cs


예를 들어 enum이 다음과 같이 생겼다고 하자.

enum Gender {
    MALE,
    FEMALE;
}
cs


ORDINAL로 지정하고 gender 속성에 Gender.MALE 값을 셋팅하면 DB에 저장되는 값은 1이다.

그럼 Gender.FEMALE 값으로 셋팅하면 어떻게 될까?

Gender에 선언되어 있는 순서가 값이 되기 때문에 2가 DB에 저장된다.

@Enumerated(EnumType.ORDINAL)
private Gender gender;
cs


STRING으로 지정하면 "MALE", "FEMALE" 문자열 자체가 저장된다.

@Enumerated(EnumType.STRING)
private Gender gender;
cs


테스트를 돌려보자.

@Test
@Transactional
public void enum_테스트() {
    EMember member = new EMember();
    member.setId(1);
    member.setGender(Gender.MALE);
    member.setGender1(Gender.FEMALE);
 
    em.persist(member);
    em.flush();
    em.clear();
 
    member = em.find(EMember.class1);
    assertThat(Gender.MALE, is(member.getGender()));
    assertThat(Gender.FEMALE.name(), is(member.getGender1().name()));    
}
cs


테이블 구조

create table emember (
    id integer not null,
    gender integer,
    gender1 varchar(255),
    primary key (id)
)
cs


사실 이와 같은 저장법은 추천해 주고 싶지 않다.

ORDINAL로 설정 후 Gender enum 타입이 변경된다면 예기치 못한 문제가 발생할 수 있기도 하고

STRING 설정은 문자열 자체가 저장되기 때문에 DB 공간 낭비가 발생한다.


이를 대체할 수 있는 좋은 방법은 converter 를 사용하는 것이다.

http://lng1982.tistory.com/279



[전체 소스]

@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class EnumTest {
 
    @PersistenceContext
    private EntityManager em;
 
    @Test
    @Transactional
    public void enum_테스트() {
        EMember member = new EMember();
        member.setId(1);
        member.setGender(Gender.MALE);
        member.setGender1(Gender.FEMALE);
 
        em.persist(member);
        em.flush();
        em.clear();
 
        member = em.find(EMember.class1);
        assertThat(Gender.MALE, is(member.getGender()));
        assertThat(Gender.FEMALE.name(), is(member.getGender1().name()));
 
        System.out.println(member);
    }
}
 
@Data
@Entity
class EMember {
 
    @Id
    private int id;
 
    @Enumerated(EnumType.ORDINAL)
    private Gender gender;
 
    @Enumerated(EnumType.STRING)
    private Gender gender1;
}
 
enum Gender {
    MALE,
    FEMALE;
}
cs


'프로그래밍' 카테고리의 다른 글

12. [JPA] 복합키  (0) 2017.09.08
11. [JPA] Querydsl  (0) 2017.09.01
spring data elasticsearch 사용해 보기  (6) 2017.08.31
10. [JPA] JPQL  (0) 2017.08.28
8. [JPA] Attribute Converter  (0) 2017.08.23
7. [JPA] fetch type - 로딩 기법  (0) 2017.08.21
6. [JPA] 영속성 전이 - Cascade  (0) 2017.08.17
5. [JPA] 엔티티 매니저  (0) 2017.08.16

댓글()