@Converter은 Entity와 DB 사이에 일관된 데이터 변환을 목적으로 합니다.
그래서 데이터를 입력하거나 출력할 때 Converter를 거치게 됩니다.
일관된 데이터 제공이 중요한 이유는 뭘까요?
개발자 혹은 라이브러리에 따라 같은 데이터를 다르게 변환하는 경우가 자주 있기 때문입니다.
정합성이 떨어지는 데이터는 데이터로서 가치가 없습니다.
Entity에 Converter를 지정하면, AttributeConverter에 지정된 함수로 데이터가 자동 변환됩니다.
Boolean, ENUM 등 다양한 데이터 타입에 사용할 수 있습니다.
DB에는 String 값으로 입력하고, Entity에는 Boolean 값으로 출력하는 예제입니다.
@Converter class BooleanConverter 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) } } @Entity class User { @Id private String user_id; @Convert(converter=BooleanConverter.class) private use_flag; }
미리 정의된 ENUM 값으로 데이터를 변환해서 입출력합니다.
enum UserType { NORMAL("1", "정상"), WITHDRAW("2", "탈퇴"), BLOCK("3", "차단") private String legacyCode; private String description; UserType(String legacyCode, String description) { this.legacyCode = legacyCode; this.description = description; } } @Converter class UserTypeConverter implements AttributeConverter<UserType, String> { @Override public String convertToDatabaseColumn(UserType attribute) { return attribute.getLegacyCode(); } @Override public UserType convertToEntityAttribute(String dbData) { return EnumSet.allOf(UserType.class).stream() .filter(e -> e.getLegacyCode().equals(dbData)) .findAny() .orElseThrow()-> new NoSuchElementException(); } } @Entity class User { @Id private String user_id; @Convert(converter=UserTypeConverter.class) private UserType user_type; }