JPA

@Converter (부제 - 데이터 변환)

쿠카이든 2022. 6. 21. 15:56
728x90
  • 컨버터(converter)를 사용하면 엔티티의 데이터를 변환해서 데이터베이스에 저장할 수 있다.
  • 자바의 boolean 타입은 방언에 따라 다르지만 데이터베이스에 저장될 때 0 또는 1인 숫자로 저장된다. 
  • 그런데 데이터베이스에 숫자 대신 문자 Y 또는 N으로 저장하고 싶다면 컨버터를 사용하면 된다.
CREATE TABLE MEMBER (

    ID VARCHAR(255) NOT NULL,
    USERNAME VARCHAR(255),
    VIP VARCHAR(1) NOT NULL,  -- 변환할 컬럼
    PRIMARY KEY(ID)
)

매핑할 테이블을 보면 문자 Y, N을 입력하려고 VIP 컬럼을 VARCHAR(1)로 지정했다.

@Entity
public class Member {
    @Id
    private String id;
    private String username;
    
    @Convert(converter=BooleanToYNConverter.class)
    private boolean vip;
    
    //Getter, Setter
    ...
}
  • 위의 회원 엔티티의 vip 필드는 boolean 타입이다. 
  • @Convert를 적용해서 데이터베이스에 저장되기 직전에 BooleanToYNConverter 컨버터가 동작하도록 했다.
@Converter
public class BooleanToYNConverter implements AttributeConverter<Boolean, String> {
    @Override
    public String converterToDatabaseColumn(Boolean attribute) {
        return (attribute != null && attribute) ? "Y" : "N";
    }
    
    @Override
    public Boolean convertToEntityAttribute(String dbData) {
        return "Y".equals(dbData);
    }
}
  • 컨버터 클래스는 @Converter 어노테이션을 사용하고 AttributeConverter 인터페이스를 구현해야 한다.
  • 제네릭에 현재 타입과 변환할 타입을 지정해야한다.
  • 여기서는 <Boolean, String>을 지정해서 Boolean 타입을 String 타입으로 변환한다.
public interface AttributeConverter<X, Y> {
    public Y convertToDatabaseColumn (X attribute);
    public X converterToEntityAttribute (Y dbData);
}

AttributeConverter 인터페이스에는 구현해야 할 다음 두 메소드가 있다.

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

 이제 회원 엔티티를 저장하면 데이터베이스의 VIP 컬럼에는 Y 또는 N이 저장된다.

 

출처 : JAVA 표준 ORM JPA 프로그래밍 (저자 : 김영한)

728x90