✔ @Converter.md

컨버터를 사용하면 엔티티의 데이터를 변환해서 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; } ```

1. 글로벌 설정

모든 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; //자동으로 컨버터가 적용됨}

@Converter 속성 정리