컨버터를 사용하면 엔티티의 데이터를 변환해서 DB에 저장할 수 있다.
예를 들어 회원의 VIP 여부를 자바의 boolean 타입을 사용하고 싶다고 하면 방언에 따라 다르지만 DB에 저장될 때 0 아니면 1인 숫자로 저장된다.
그런데 DB에 숫자 대신 문자 Y 또는 N으로 저장하고 싶다면 컨버터를 사용하면 된다.
--매핑할 테이블CREATE TABLE MEMBER{ ID VARCHAR(255) NOT NULL, USERNAME VARCHAR(255), VIP VARCHAR(1) NOT NULL, --Y, N 을 입력하기 위함 PRIMARY KEY (ID)}
@Getter @Setter@Entitypublic class Member{ @Id private String id; private String username; @Convert(converter = BooleanToYNConverter.class) private boolean vip;}
@Converter를 적용해 DB에 저장되기 직전에 BooleanToYNConverter 컨버터가 동작하도록 했다.
@Converterpublic class BooleanToYNConverter implements AttributeConverter<Boolean, String>{ @Override public String converterToDatabaseColumn(Boolean attribute){ return (attribute != null && attribute) ? "Y" : "N"; } @Override public Boolean converterToEntityAttribute(String dbData){ return "Y".equals(dbData); }}
컨버터 클래스는 @Converter 어노테이션을 사용하고 AttributeConverter 인터페이스를 구현해야 한다. 그리고 제네릭에 현재 타입과 변환 타입을 지정해야 한다.(<Boolean,String> -> Boolean 타입을 String 타입으로)
public interface AttributeConverter<X,Y>{ public Y convertToDatabaseColumn (X attribute); public X convertToEntityAttribute (Y attribute);}
AttributeConverter 인터페이스에 구현해야 할 두 메소드가 있다. - convertToDatabaseColumn() : 엔티티의 데이터를 DB 컬럼에 저장할 데이터로 변환한다.(true -> Y) - converterToEntityAttribute() : DB에서 조회한 컬럼 데이터를 엔티티의 데이터로 반환한다. (Y -> true)
이제 회원 엔티티를 저장하면 DB의 VIP 컬럼에는 Y 또는 N이 저장된다.
컨버터는 클래스 레벨에도 설정할 수 있다.
이때는 attributeName 속성을 이용해 어떤 필드에 컨버터를 적용할지 명시해야 한다. javajava @Entity @Convert(converter = BooleanToYNConverter.class, attributeName = “vip”) public class Member{ @Id private String id; private String username; private boolean vip; } ```
모든 Boolean 타입에 컨버터를 적용하려면 @Converter(autoApply = true) 옵션을 적용하면 된다.
@Converter(autoApply = true)public class BooleanToYNConverter implements AttributeConverter<Boolean, String>{ @Override public String converterToDatabaseColumn(Boolean attribute){ return (attribute != null && attribute) ? "Y" : "N"; } @Override public Boolean converterToEntityAttribute(String dbData){ return "Y".equals(dbData); }}
이렇게 글로벌 설정을 하면 @Converter를 지정하지 않아도 모든 Boolean 타입에 자동으로 컨버터가 적용된다.
@Entitypublic class Member{ @Id private String id; private String username; private boolean vip; //자동으로 컨버터가 적용됨}