JPA | 고급스럽게 AttributeConverter 사용하기

xeounxzxu
4 min readMay 6, 2022

--

JPA 프로젝트를 진행을 하다보면 enums 를 type 으로 사용을 많이 하게 된다. AttributeConverter 를 사용을 많이 하게 되는데 기본적인 사용법은 여기서 보면된다.

일단 Enum을 사용하는데 있어서 Converter 를 사용을 많이 한다. 계속되는 Converter 를 사용을 하다보면 반복되는 로직이 발생이 하게 된다. 공통화 및 모듈화에 대한 리팩토링에 대한 내용을 포스팅 하려고 한다.

객체 설계

그림과 같이 설계를 하려고 한다. 일단 interface, abstract class 의 개념은 관점 그리고 기능으로 나누기로 하였다.

AttributeConverter 의 경우 JPA 모듈에 있는 인터페이스 중 하나 이며 기능을 정의 하고 있다, 그리고 AbstractBaseEnumConverter 는 관점을 담고 있는 Converter 이다. 그리고 RoleEnumConverter 는 구현 클래스 이다.

AttributeConverter 는 convertToDatabaseColumnconvertToEntityAttribute 두 가지 메소드가 정의 된다. convertToDatabaseColumn 는 데이터 베이스에 저장이 될 때 데이터를 변경을 해주는 것이고 convertToEntityAttribute 는 데이터베이스에서 데이터를 불러 올때 호출 되는 메소드 이다.

코드 구현

BaseEnum interface 를 기존에 사용하는 RoleEnum 에 상속을 시켜준다. 유동적으로 타입을 사용을 하기 위해서 BaseEnumgetValue 메소드를 제네릭으로 선언을 해주었다. BaseEnum<String> , BaseEnum<Long> … 이렇게 사용을 할 수 있다. RoleEnum의 경우 string 으로 선언을 해주었다. 간단하게 제네릭을 사용을 하는 이유중 하나로 능동적인 형변환과 컴파일 중 타입을 체크 하는 이유로 사용을 한다.

AbstractBaseEnumConverter 의 경우 AttributeConverter 를 상속을 시켜 주었다. 일단 추상화 클래스 이기 때문에 interface 메소드를 강제적으로 구현을 안해 줘도 된다. 하지만 “공통적” 기능이기 때문에 구현을 해주었다.

여기서 특징적인 것은 getEnumClassfoundOf 라는 메소드 인데 상속을 받는 구현 클래스에서 강제적으로 클래스 타입을 넣어줘서 getEnumClass 에서 클래스를 가지고 와서 값 비교를 통해서 Enum 값을 가지고 온다.

<E extends BaseEnum> 의 경우 BaseEnum 을 상속 받은 enum 만 선언이 가능하다.

구현체에서는 AbstractBaseEnumConverter 을 상속을 받아서 getEnumClassRoleEnum.class 를 정의를 시켜준다.

RoleEnumConverter 그리고 StateEnumConverter 이렇게 계속 늘려가면 된다. 그러면 계속 바꾸지 않고 converter 기능을 가진 추상화 클래스를 상속 받아서 getEnumClass 만 정의 해주면 된다.

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

--

--

xeounxzxu
xeounxzxu

No responses yet

Write a response