JPA entity에서 Enum 값을 사용하는 경우 흔히 아는 건 ORDINAL, STRING 옵션이다. 하지만 서비스를 구성하다 보면 DB에 특정 코드가 들어가야 하는 경우도 분명 있을 거다.
예시를 한번 보자
이런식으로 ENUM이 구성되어 있을 때 별도의 설정 없이 사용하면 ORDINAL 값인 인덱스 값이 들어가고 옵션을 STRING으로 설정하면 ENUM의 이름 자체가 DB에 인서트 될 것이다. 하지만 만약 저 code 값을 DB에 넣어주고 싶다면 어떻게 해야 할까
위 이미지는 Hibernate 공식 페이지의 설명이다. 열거형 옵션에는 ORDINAL, STRING만 지원을 하고 다른 옵션은 제공하지 않는다.
하지만 바로 아래로 내려가면 Converters라는 내용이 있다.
대충 설명하자면 주어진 자바 유형을 ORDINAL, STRING으로 변환하거나 데이터베이스에서 작업이 일어날 때 사전사후 처리를 해준다고 한다.
이 기능을 사용해서 ENUM이 인서트 되기 전 ENUM 내부 특정값으로 바꿔주고 가지고 와서는 ENUM 값으로 보이도록 구성이 가능해진다.
AttributeConverter 인터페이스를 통해 컨버터 구현체를 만들어 줄 거다. 우선 내부가 어떤 식으로 구성이 되어있는지 보자
AttributeConverter 내부를 보면 따로 구현할 구현체 외에도 Hibernate내부 동작에서도 사용을 하고 있다.
이제 우리가 ENUM에서 사용할 컨버터를 구성해 보자
이런 식으로 우선 간단하게 컨버터를 작성해줬다. convertToDatabaseColumn은 DB에 입력될 때 전처리 해주는 것이고 convertToEntityAttribute는 DB에서 값을 가지고 왔을때 ENUM값으로 표시해주는 컨버터이다.
DB 에서 가져온 값을 ENUM으로 표시하기 위해 ENUM 클래스에 변환로직을 작성해 준다.
그리고 @Converter(autoApply = true)를 컨버터 클래스 위에 명시해 주면 아래처럼 특별한 설정 없이 해당 ENUM에 자동으로 적용된다. 하지만 지금 필요한 것은 아니라 코드에선 빼둔 상태이다.
그다음 엔티티에 설정을 해주자
이런 식으로 Converter 클래스를 입력해 주면
DB에 코드 값으로 정상 입력 된다.
하지만 fromCode에서 for문을 보고 좀 찜찜함을 느끼는 사람도 있었겠지만 저게 지금 당장은 문제가 안되지만 나중에 DB 요청 자체가 많아지게 되면 저거 자체가 매우 불필요한 낭비다. 이걸 사용하려면 잘 고민을 해보고 사용하면 좋을 것 같다.
REFERENCE
https://docs.jboss.org/hibernate/orm/6.3/introduction/html_single/Hibernate_Introduction.html#enums
'Dev > SpringData' 카테고리의 다른 글
[JPA] 더티 체킹(Dirty Checking) (0) | 2021.12.22 |
---|---|
[JPA] N + 1 이슈 (0) | 2021.12.17 |
[JPA] 양방향 연관관계(무한 루프) (0) | 2021.12.14 |
[Querydsl] Projection 정리 (0) | 2021.12.12 |
[Querydsl] QueryDSL 사용법 정리 (0) | 2021.12.03 |