컨버터를 사용하면 엔티티이 데이터를 변환하여 데이터베이스에 저장할 수있습니다.
주로 개인정보에 암호화/복호화 해야 하는 정보나, 날짜에 원하는 방식으로 저장하기 위하여 오노테이션이 붙어있습니다.
public interface AttributeConverter<X,Y>{
public Y convertToDatabaseColumn(X attributes);
public X convertToEntityAttribute(Y dbData);
X : 엔티티의 속성에 대응하는 타입
Y : DB에 대응하는 타입
convertToDatabaseColumn : 엔티티의 X 타입 속성을 Y타입의 DB 데이터로 변환합니다.
convertToEntityAttribute : Y 타입으로 읽은 DB 데이터를 엔티티의 X 타입의 속성으로 변환합니다.
JPA 를 사용하면 자바의 boolean 타입은 방언에 따라 다르지만 데이터베이스에 저장될 때 0 또는 1인 숫자로 저장됩니다. 그런데 DB에 숫자 대신 문자 Y or N 으로 저장하고 싶다면 컨버터를 사용하면 됩니다.
방언 : 서로 다른 데이터베이스 간의 SQL 문법 차이를 의미합니다.
아래의 코드는 @Converter를 적용하여 데이터베이스에 저장되기 직전에 BooleanToYNConverter 컨버터가 동작합니다. Meber 엔티티의 vip 필드는 boolean 타입입니다.
Converter 가 사용 될 Member 클래스
@Enttity
@Data
public class Member{
@Id
private String id;
private String name;
@Convert(converter = BooleanToYNConverter.class)
private boolean vip;
}
@Converter
어노테이션을 사용하여 AttributeConverter 인터페이스를 구현해야 합니다.@Converter
public class BooleanToYNConverter implements AttributeConverter<Boolean,String>{
public String convertToDatabaseColumn(Boolean attribute){
return ( attribute != null && attribute) ? "Y" : "N";
}
public Boolean convertToEntityAttribute(String s){
return "Y".equals(s);
}
}
package com.pluspark.operational.report.lab;
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
import javax.print.attribute.Attribute;
@Converter
public class StringDateHyphenConverter implements AttributeConverter<String,String> {
@Override
public String convertToDatabaseColumn(String attribute) {
return attribute.replace("-","");
}
@Override
public String convertToEntityAttribute(String dbData) {
StringBuilder sb = new StringBuilder();
sb = sb.append(dbData.substring(0,4));
sb = sb.append("-");
sb = sb.append(dbData.substring(4,6));
sb = sb.append("-");
sb = sb.append(dbData.substring(6,8));
return sb.toString();
}
}
@Data
@AllArgsConstructor
public class Monkey{
private Double value;
private String currency;
}
@Embeddable
를 사용할 수는 없습니다.@Converter(autoApply =true)
public class MonkeyConverter implements AttributeConverter<Monkey,String>{
@Override
public String convertToDatabaseColumn(Monkey attribute){
if(attribute == null){
return null;
}
return attribute.toString();
}
@Override
public Monkey convertToEntityAttribute(String dbData){
if(dbData == null){
returen == null;
}else{
String value = dbData.subString(0, dbData.length() -3);
String currency = dbData.subString(dbData.length()-3);
return enw Monkey(Double.valueOf(value),currency);
}
}
}