JPA | AttributeConverter 을 사용한 엔티티 구성

DoItDev·2021년 11월 4일
1
post-thumbnail

AttributeConverter

공식 Docs 에서는 아래와 같이 되어있습니다.

화면 캡처 2021-11-04 134905

- 이 인터페이스를 구현하는 클래스를 사용하여 변환할 수 있습니다.
- 데이터베이스 열 표현에 엔티티 특성 상태 입력
- X와 Y 타입은 Java 타입이 같을 수 있음에 유의하십시오.

여기서 X 와 Y 의 경우 X 의 경우 JAVA 에서 사용하는 타입

그리고 Y의 경우 DB에 저장되는 타입이라고 생각하시면 됩니다.

그리도 두가지 메소드가 내장이 되어있습니다.

convertToDatabaseColumnconvertToEntityAttribute 가 내장이 되어있는데

convertToDatabaseColumn의 경우 테이블에 저장혹은 변경이 있을 때 호출이 되는 메소드 입니다.

convertToEntityAttribute의 경우 테이블에서 출려이 될때 호출이된는 메소드 입니다.

이렇게 두가지 메소드를 사용해서 enum을 jpa 엔티티에서 사용을 해보려고 합니다.

결국에 AttributeConverter는 변환 인터페이스라고 그리고

두 메소드는 인풋 과 아웃풋일떄 변환 해주는 메소드 라고 생각 하시면 됩니다.

기본적인 사용법

화면 캡처 2021-11-04 131359

유저 테이블에서의 데이터 입니다.

유저테이블에서 성과 이름 그리고 성별을 저장 하고 관리를 하는 구조 입니다.

여기서 성별의 경우 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를 명시를 해주고 뒤에

convertToDatabaseColumnconvertToEntityAttribute를 작성을 해줍니다.

후에 사용할 엔티티로 가서 아래와 같이 사용을 합니다.

@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>
profile
Back-End Engineer

0개의 댓글