공식 Docs 에서는 아래와 같이 되어있습니다.
- 이 인터페이스를 구현하는 클래스를 사용하여 변환할 수 있습니다.
- 데이터베이스 열 표현에 엔티티 특성 상태 입력
- X와 Y 타입은 Java 타입이 같을 수 있음에 유의하십시오.
여기서 X 와 Y 의 경우 X 의 경우 JAVA 에서 사용하는 타입
그리고 Y의 경우 DB에 저장되는 타입이라고 생각하시면 됩니다.
그리도 두가지 메소드가 내장이 되어있습니다.
convertToDatabaseColumn
와 convertToEntityAttribute
가 내장이 되어있는데
convertToDatabaseColumn의 경우 테이블에 저장혹은 변경이 있을 때 호출이 되는 메소드 입니다.
convertToEntityAttribute의 경우 테이블에서 출려이 될때 호출이된는 메소드 입니다.
이렇게 두가지 메소드를 사용해서 enum을 jpa 엔티티에서 사용을 해보려고 합니다.
결국에 AttributeConverter는 변환 인터페이스라고 그리고
두 메소드는 인풋 과 아웃풋일떄 변환 해주는 메소드 라고 생각 하시면 됩니다.
유저 테이블에서의 데이터 입니다.
유저테이블에서 성과 이름 그리고 성별을 저장 하고 관리를 하는 구조 입니다.
여기서 성별의 경우 Enum을 사용하기 좋은 예제입니다.
성별의 경우 w,m 으로만 저장이 됩니다.
@Getter
public enum Gender implements BaseEnumCode<String> {
NULL("빈값", ""),
WOMAN("여자", "W"),
MAN("남자", "M");
private final String desc;
private final String value;
Gender(String desc, String value) {
this.desc = desc;
this.value = value;
}
private static final Map<String, Gender> descriptions = Collections.unmodifiableMap(Stream.of(values()).collect(Collectors.toMap(Gender::getValue, Function.identity())));
public static Gender findOf(String findValue) {
return Optional.ofNullable(descriptions.get(findValue)).orElse(NULL);
}
}
위 와 같이 Enum을 작성을 해줍니다.
값과 성멸의 데이터를 저장시켜줍니다.
null 의경우 잘못된 데이터를 의미합니다.
그리고 convert 를 작성을 해줍니다.
public class GenderConvert implements AttributeConverter<Gender, String> {
@Override
public String convertToDatabaseColumn(Gender attribute) {
return Optional.ofNullable(attribute).orElse(Gender.NULL).getValue();
}
@Override
public Gender convertToEntityAttribute(String dbData) {
if (StringUtils.isEmpty(dbData)) {
return Gender.NULL;
}
return Gender.findOf(dbData);
}
}
위와 같이 AttributeConverter
을 상속 받아서 x,y를 명시를 해주고 뒤에
convertToDatabaseColumn
와 convertToEntityAttribute
를 작성을 해줍니다.
후에 사용할 엔티티로 가서 아래와 같이 사용을 합니다.
@Convert
어노테이션을 사용을 합니다.
public class User {
@Convert(converter = GenderConvert.class)
@Column(name = "gender")
private Gender gender;
}
@Convert
를 이용해서 사용이 가능한데 클레스에서 맨위에 사용을 한다면
컬럼 name 과 attributeName 을 같게 naming 해주어야 합니다
또한 위의 기본 사용법과 같이 column 레벨에서 사용을 안해줘도 자동으로 매핑이 됩니다
@Convert(converter = GenderConvert.class , attributeName = "gender")
public class User {
@Column(name = "gender")
private Gender gender;
}
하지만 매번 엔티티에 convert 어노테이션을 사용하기 실다고 하시면
enum converter 에서 @Converter
autoApply을 true로 선언을 해주면
글로벌로 사용이 가능합니다.
@Converter(autoApply = true)
public class GenderConvert implements AttributeConverter<Gender, String>