JPA

@Converter를 이용해 데이터를 변환해서 저장하고 가져오기

Beekei 2022. 1. 20. 16:12
반응형

컨버터를 사용하면 엔티티의 데이터를 변환해서 데이터베이스에 저장할 수 있다.

예를 들어 회원의 VIP여부를 데이터베이스에는 "Y", "N"으로 저장하고 엔티티에서는 boolean 타입으로 변환해서 사용할 수 있다.

@Entity
public class Member {
    ...
    @Convert(converter = VipConverter.class)
    private boolean isVip;
    
}

@Converter
public class VipConverter implements AttributeConverter<Boolean, String> {
	
    // 엔티티의 데이터를 데이터베이스 컬럼에 저장할 데이터로 변환
    @Override
    public String convertToDatabaseColumn(Boolean attribute) {
        return (attribute != null && attribute) ? "Y":"N";
    }
    
    // 데이터베이스에서 조회한 컬럼 데이터를 엔티티의 데이터로 변환
    @Override
    public Boolean convertToEntityAttribute(String dbData) {
        return "Y".equals(dbData);
    }
    
}

 

 

Converter 클래스에 AttributeConverter<엔티티 컬럼 타입, 데이터베이스 컬럼 타입>을 상속받고

convertToDatabaseColumn, convertToEntityAttribute 매서드를 구현하면 된다.

 

 

클래스 레벨에도 설정이 가능하다.

클래스 레벨에 설정하려면 attributeName 속성을 꼭 설정해야 한다.

@Entity
@Convert(converter = VipConverter.class, attributeName = "isVip")
public class Member {
    ...
    private boolean isVip;
    
}

 

 

컨버터는 글로벌 설정도 할 수 있다.

@Converter(autoApply = true)
public class VipConverter implements AttributeConverter<Boolean, String> {
	
    // 엔티티의 데이터를 데이터베이스 컬럼에 저장할 데이터로 변환
    @Override
    public String convertToDatabaseColumn(Boolean attribute) {
        return (attribute != null && attribute) ? "Y":"N";
    }
    
    // 데이터베이스에서 조회한 컬럼 데이터를 엔티티의 데이터로 변환
    @Override
    public Boolean convertToEntityAttribute(String dbData) {
        return "Y".equals(dbData);
    }
    
}

@Converter 어노테이션의 autoApply 속성을 true로 설정하면 엔티티의 모든 Boolean 타입은 컨버터가 적용된다. 

disableConversion 속성을 true로 설정하면 글로벌 컨버터나 상속받은 컨터버를 사용하지 않을 수 있다.

반응형