
JPA 프로젝트를 진행을 하다보면 enums 를 type 으로 사용을 많이 하게 된다. AttributeConverter 를 사용을 많이 하게 되는데 기본적인 사용법은 여기서 보면된다.
일단 Enum을 사용하는데 있어서 Converter 를 사용을 많이 한다. 계속되는 Converter 를 사용을 하다보면 반복되는 로직이 발생이 하게 된다. 공통화 및 모듈화에 대한 리팩토링에 대한 내용을 포스팅 하려고 한다.
객체 설계

그림과 같이 설계를 하려고 한다. 일단 interface, abstract class 의 개념은 관점 그리고 기능으로 나누기로 하였다.
AttributeConverter 의 경우 JPA 모듈에 있는 인터페이스 중 하나 이며 기능을 정의 하고 있다, 그리고 AbstractBaseEnumConverter 는 관점을 담고 있는 Converter 이다. 그리고 RoleEnumConverter 는 구현 클래스 이다.

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


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

AbstractBaseEnumConverter 의 경우 AttributeConverter 를 상속을 시켜 주었다. 일단 추상화 클래스 이기 때문에 interface 메소드를 강제적으로 구현을 안해 줘도 된다. 하지만 “공통적” 기능이기 때문에 구현을 해주었다.
여기서 특징적인 것은 getEnumClass
와 foundOf
라는 메소드 인데 상속을 받는 구현 클래스에서 강제적으로 클래스 타입을 넣어줘서 getEnumClass
에서 클래스를 가지고 와서 값 비교를 통해서 Enum 값을 가지고 온다.
<E extends BaseEnum>
의 경우 BaseEnum 을 상속 받은 enum 만 선언이 가능하다.

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

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