티스토리 뷰

최근에 Enum을 이렇게도 저렇게도 사용해보게 되었다. 그 동안 회사 프로젝트에서는 왜 사용을 안 했는지 정말 후회되는 Enum...

 

나 처럼 enum을 처음 사용해보는 사람은 JPA를 사용할 때 entity에 enum class를 column으로 사용했을 때 DB에 원하던 enum 값(name)이 아니라 enum의 해당 값의 index가 들어가는 현상을 확인할 수도 있다.

 

 

예를 들어 아래와 같은 enum이 있다고 하자.

@Getter
public enum Menu {
	BULGOGI_PIZZA(10000, "PIZZA"),
    	CHEESE_PIZZA(8000, "PIZZA"),
   	POTATO_PIZZA(11000, "PIZZA"),
    	;
 }

 

또한 해당 Menu enum을 이용해서 아래와 같은 entity를 구성했다고 하자.

@Entity
@Table
@Getter
@NoArgsConstructor
public class Order {
	...
	
	@Column(name = "menu")
	private Menu menu;
	
	...
}

 

위와 같이 구성을 하고 entity를 DB에 저장할 경우 아래와 같이 내가 원하는 'BULGOGI_PIZZA', 'CHEESE_PIZZA', 'POTATO_PIZZA'와 같은 값이 DB에 들어가는 것이 아니라, 해당 값의 index가 DB에 저장된다.

원래는 8번 row처럼 POTATO_PIZZA처럼 메뉴 명이 저장되길 원하는데 아무 설정을 하지 않을 경우 CHEESE_PIZZA로 DB에 저장했을 때 위와 같이 CHEESE_PIZZA의 index 값이 DB에 저장된다.

 

 

@Enumerated(value = EnumType.STRING) 

enum의 값을 index가 아닌 텍스트 값 그대로 저장하고 싶을 때 위의 어노테이션을 아래와 같이 entity에서 column을 정의해주는 곳에 붙여주면, DB에 enum의 값 자체가 텍스트 그대로 저장이 잘 된다.

import javax.persistence.EnumType;

...
public class Order {
	...
    
	@Enumerated(value = EnumType.STRING) // 또는 @Enumerated(EnumType.STRING)
	@Column(name = "menu")
	private Menu menu;
	
	...
}

 

@Enumerated 안에는 entity에 매핑된 컬럼 안에 enum 값을 어떻게 넣을지 정의할 수 있다.

기본 값은 @Enumerated(value = EnumType.ORDINAL) 또는 @Enumerated(EnumType.ORDINAL)로 EnumType.ORDINAL로 설정해놓을 경우(아무 설정을 하지 않을 경우) 해당 enum값의 index가 DB에 들어가게 된다.

 

하지만 이것을 @Enumerated(value = EnumType.STRING) 또는 @Enumerated(EnumType.STRING)으로 설정하게 될 경우 해당 enum의 name 즉, 값이 그대로 들어가지게 된다. 즉, DB에 enum name 값을 넣을 때는 위의 어노테이션을 이용해서 enum의 값이 텍스트 그대로 들어가지게 entity의 column에 어노테이션 설정을 해줘야 한다.

 

 

위 어노테이션을 설정하고 다시 entity에 값을 넣어 DB에 데이터를 save 해보면 위와 같이 enum의 name 값인 CHEESE_PIZZA가 잘 들어간 것을 확인할 수 있다.

 

 

주의사항

enum 값(name)으로 DB에 저장하면 더 알아보기 쉽다. 하지만 enum 값을 저장하는 과정에서 int가 string을 DB에 저장하게 되고 이는 메모리 용량을 좀 더 증가 시킬 수 있다. 하지만 이것은 데이터가 아주 많을 때의 문제이고 그렇지 않을 경우에는 큰 문제가 되지 않는다.

 

제일 큰 문제는 만일 enum에서는 CHEESE_PIZA의 명칭을 CHEESEPIZA로 변경했을 경우에 맞는 name 값이 없어서 DB에서 해당 부분 데이터를 읽어오는데 에러가 발생한다는 것이다. 기본 값인 EnumType.ORDINAL로 사용했을 때는 enum의 값들 순서가 바뀔 경우 데이터를 잘못 읽어오는 문제가 생긴다.

 

enum의 기존 값들의 순서가 바뀌거나 기존 name이 달라질 일이 없으면 신경쓰지 않고 @Enumerated 어노테이션을 사용해도 되지만(새로운 값이 추가되는 경우는 상관 없다.) 그렇지 않을 경우에는 별도 Converter를 생성해 enum의 값을 DB에 넣을 때와 enum의 값을 DB에서 읽어올 때에 작동하는 함수를 오버라이딩해서 바뀐 데이터에 대해 재처리 하는 로직을 작성해야 한다.

 

Converter에 대해서는 다음에 정리해 글을 작성하겠다.

 

 

 

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함