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 |
댓글