흰 스타렉스에서 내가 내리지

[JPA] 엔티티의 데이터를 변환해서 DB 에 저장하는 @Converter 본문

JPA

[JPA] 엔티티의 데이터를 변환해서 DB 에 저장하는 @Converter

주씨. 2024. 4. 25. 19:33
728x90

예를 들어, 북마크 여부를 boolean 타입으로 사용하고 싶다고 하자. 

JPA 를 사용하면 DB에 저장될 때 0 또는 1인 숫자로 저장된다. 

그런데 DB 에 숫자 대신 문자 Y 또는 N 으로 저장하고 싶다면 컨버터를 사용하면 된다. 

 

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

 

 

- Boolean 을 YN 으로 변환해주는 컨버터

@Converter
public class BooleanYNConverter implements AttributeConverter<Boolean, String>{

    @Override
    public String convertToDatabaseColumn(Boolean attribute){
        return (attribute != null && attribute) ? "Y" : "N";
    }
    
    @Override
    public String convertToEntityAttribute(String dbData){
        return "Y".equals(dbData);
    }
    
}

 

  • 컨버터 클래스는 @Converter 어노테이션을 사용하고 AttributeConverter 인터페이스를 구현해야 한다.
  • 그리고 제네릭에 현재 타입과 반환할 타입을 지정해야 한다. 
  • 여기서는 <Boolean, String> 을 지정해서 Boolean 타입을 String 타입으로 변환한다.

 

- AttributeConverter

public interface AttributeConverter<X, Y> {

    public Y convertToDatabaseColumn (X attribute);
    public X convertToEntityAttribute (Y dbData);

}
  • convertToDatabaseColumn() : 엔티티의 데이터를 데이터베이스 컬럼에 저장할 데이터로 변환한다.
  • convertToEntityAttribute() : 데이터베이스에서 조회한 컬럼 데이터를 엔티티의 데이터로 변환한다.

 

 

# 글로벌 설정

  • 모든 Boolean 타입에 컨버터를 적용하려면 다음과 같이 @Converter(autoApply = true) 옵션을 적용해준다.
@Converter(autoApply = true)
public class BooleanYNConverter implements AttributeConverter<Boolean, String>{

    @Override
    public String convertToDatabaseColumn(Boolean attribute){
        return (attribute != null && attribute) ? "Y" : "N";
    }
    
    @Override
    public String convertToEntityAttribute(String dbData){
        return "Y".equals(dbData);
    }
    
}

 

  • 이렇게 글로벌 설정을 하면 @Convert 를 지정하지 않아도 모든 Boolean 타입에 대해 자동으로 컨버터가 적용된다.
@Entity
public class Member {
    ...
    
    private boolean bookmarked;
    
    ...
}