자바 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.class, 1); 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.class, 1); 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 |