진짜 개발자
본문 바로가기

FrameWork/Spring JPA

JPA - Enum을 이용해 Column 저장하기

728x90
JPA 에서 Enum 값 사용하기

DDD를 공부하며 jpa를 사용하던 도중 User의 authority값을 정하기 위해서 Enum을 사용하면 조금더 직관적이겠다 싶어서 Enum을 사용하게 되었습니다. 이때 사용했던 것들에 대해 간단히 정리해보도록 하겠습니다.

 

1. 예제에 사용될 Entity 와 Enum

우선 예제에 사용될 Entity와 Enum클래스들을 살펴보겠습니다.

 

바로 위에 보이는 클래스가 Entity클래스 입니다. JPA에 대한 사용법을 알려드리는 포스팅이 아니므로 자세한 설명은 넘어가도록 하겠습니다. 하나 짚고 넘어갈 것은, JPA에서 Entity 내부에 Column으로 Java Class를 추가 하기 위해서는 @Embedded 어노테이션을 사용해야하지만, Enum의 경우에는 해당 어노테이션이 필요가 없습니다.

 

 

2. @RequestBody의 filed에 Enum값 매핑하는 법

소제목이 조금 거창한데요, JPA에 Entity를 저장할 때 enum에 해당하는 필드를 어떻게 지정해야하는지 간단히 알려드리겠습니다.

 

뭐 따로 알려드릴것도 없지만. 저는 이부분이 약간 헷갈렸습니다. Enum 을 사용하는 Filed의 이름을 key값으로 하고, Enum 클래스에 선언된 상수값을 value로 전달하면 됩니다.

 

 

3. Enum 상수값을 그대로 DB에 저장하는 법

2.에서 알려드린 방법으로 저장을 하게 되면, 위 그림과 같이 왠 정수가 저장이 되는 것을 볼 수 있습니다. 이 값들은 해당 상수의 순서번호 입니다. 그렇다면 어떻게 Enum 상수 값을 그대로 DB에 저장할 수 있을 까요?

 

Entity 클래스에 간단히 @Enumerted(EnumType.STRING)어노테이션을 추가해주면 됩니다.

 


 

 

4. Attribute Converter 사용하기

사실 위와 같이 @Enumerated어노테이션을 사용하는 것은 성능상 좋지 못하다고 합니다. 그렇다면 어떤 방법이 있을 까요.

 

첫번째로 생각해 볼 수 있는 방법은 직접 Converter를 사용하는 것입니다. 웹의 특성상 앞선 Enum의 문제의 결과로 저장된 0 또는 1의 값을 그대로 웹페이지에 출력하여 사용하는 일은 없을 것입니다. 때문에 이런 경우 Application에서 DB로부터 데이터를 가져와 if 문을 이용하여 0인 경우 ROLE_USER , 1인 경우 ROLE_ADMIN과 같은 식으로 분기문을 이용해 처리할 수도 있습니다. 하지만, 이는 System이 변경됨에 따라서 코드를 수정해야하게 되므로 유지보수에 좋지 못한 방법입니다.

 

따라서 Attribute Converter라는 방법을 이용하면 좋습니다.

https://lng1982.tistory.com/279