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' 카테고리의 다른 글
| [QueryDSL] QueryDSL 설정2 - Mysql 연동 (0) | 2024.11.25 | 
|---|---|
| [QueryDSL] QueryDSL 설정 1 - QueryDsl 설정 적용 (1) | 2024.11.24 | 
| [JPA] JPA의 설정 옵션들 (0) | 2022.01.26 | 
| [JPA] JPQL Named 쿼리 (0) | 2021.09.28 | 
| [JPA] JPQL 엔티티 직접 사용 (0) | 2021.09.28 | 
		
	
                
                
                
                
                
                
                
                                                
                
                
                
										
									
										
									
댓글