Free Lines Arrow
본문 바로가기
DataBase/JPA

[JPA] AttributeConverter

by skahn1215 2022. 4. 2.
728x90
반응형

AttributeConverter 사용이유

  • Enum 값을 DB 에 저장할 경우 다음과 같은 상황이 생길 수 있다.
    - Enum 값이 길때 간단한 코드로 값을 만들어 저장 하는 것이다.
    - Enum 값을 코드로 저장할 경우 컬럼이 많을 경우 문제가 생길수 있다.
  • 백엔드 개발을 할때 java 와 DB 사이에 값을 변환할때 필요하다.
    - 아래와 같이 저장하고 불러 올때 사용한다.
  Java Enum DB
Year y
Month m
일  Day d

 

AttributeConverter

  • Enum 값을 Code 로 저장할수 있게 해주는 Interface 이다. 
  • 그렇다 Interface 이면 직접 구현을 해줘야한다.

 

AttributeConverter interface 구조

public interface AttributeConverter<X,Y> {
    public Y convertToDatabaseColumn (X attribute);
    public X convertToEntityAttribute (Y dbData);
}
  • X: Entity 의 속성 타입(Field)
  • Y: DB 의 컬럼 타입이다.

convertToDatabaseColumn

  • Entity 의 field 값을 DB 속성 값으로 변환할때 사용한다.
  • DB 에 값을 저장할때 사용

convertToEntityAttribute

  • DB 에 저장된 값을 Entity 의 Filed 값으로 변환 할때 사용한다.
  • DB 에서 값을 불러 올때 사용

 

예제

  • 회원(Member)들은 등급(MemberShip)을 가지고 있다.

 

구현순서

  • AttributeConverter 구현체 생성
  • Entity 에 @Convert 어노테이션을 적용

 

Member Entity

  • 코드는 간단하게 구현했다.
  • @Convert 를 꼭 넣어줘야 적용이 된다.
@Getter
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(name = "member")
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "member_id")
    private Long id;

    @Convert(converter = MemberShipConvert.class)
    private MemberShip memberShip = MemberShip.SILVER;
}

 

MemberShip Enum Class

package com.practicalbusiness.study.jpa.domain;

import com.fasterxml.jackson.annotation.JsonCreator;

public enum MemberShip implements CodeValue {
    GOLD("G", "GOLD"), SILVER("S", "SILVER"), VIP("V", "VIP");

    private final String code;
    private final String value;

    @Override
    public String getCode() {
        return this.code;
    }

    @Override
    public String getValue() {
        return this.code;
    }

    MemberShip(String code, String value) {
        this.code = code;
        this.value = value;
    }

    @JsonCreator
    public static MemberShip fromString(String symbol) {
        return MemberShip.valueOf(symbol);
    }
}

 

AttributeConverter 구현

  • DB 에 저장할 경우 Enum 값의 code 저장한다.
  • DB 에 불러올 경우 저장된 code 값으로 value 와 맞는 값을 가져온다
package com.practicalbusiness.study.jpa.domain;

import lombok.extern.slf4j.Slf4j;

import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
import java.util.stream.Stream;

@Slf4j
@Converter(autoApply = true)
public class MemberShipConverter implements AttributeConverter<MemberShip,String> {

    @Override
    public String convertToDatabaseColumn(MemberShip attribute) {
        log.info("attribute is : {} ", attribute.getCode());
        return attribute.getCode();
    }

    @Override
    public MemberShip convertToEntityAttribute(String dbData) {
        log.info("attribute is : {} ", dbData);
        return Stream.of(MemberShip.values())
                .filter(m -> m.getCode().equals(dbData))
                .findFirst()
                .orElse(null);
    }
}

 

결과

로그

attribute is : G 
Converted value on binding : GOLD -> G

 

DB 값

 

728x90
반응형

'DataBase > JPA' 카테고리의 다른 글

[JPA] JPA의 설정 옵션들  (0) 2022.01.26
[JPA] JPQL Named 쿼리  (0) 2021.09.28
[JPA] JPQL 엔티티 직접 사용  (0) 2021.09.28
[JPA] JPQL Fetch Join  (0) 2021.09.26
[JPA] JPQL 경로표현식  (0) 2021.09.26

댓글