[Spring] Enum 타입을 DB에 저장하기

zioo·2022년 4월 4일
0

Spring

목록 보기
2/6

Enum을 DB에 저장하는 방법

@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의 값 자체가 텍스트 그대로 저장이 된다.

  • 기본 값은 @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에 어노테이션 설정을 해줘야 한다.

Enum 단점

단점

  • enum 값을 저장하는 과정에서 int가 string을 DB에 저장. -> 메모리 용량을 좀 더 증가 시킬 수 있다. (데이터가 많을 때만 문제)
  • CHEESE_PIZA의 명칭을 CHEESEPIZA로 변경했을 경우에 맞는 name 값이 없어서 DB에서 해당 부분 데이터를 읽어오는데 에러가 발생한다
  • 기본 값인 EnumType.ORDINAL로 사용했을 때는 enum의 값들 순서가 바뀔 경우 데이터를 잘못 읽어오는 문제가 생긴다.
  • Converter 생성
    • enum의 기존 값들의 순서가 바뀌거나 기존 name이 달라질 때 사용

0개의 댓글