본문 바로가기
Library & Framework/JPA

@Converter 사용해서 DB값 변환하기

by codeyaki 2023. 9. 6.
반응형

엔티티의 속성 중에 boolean 타입을 사용하는 속성은 DB에 저장 시에는 DBMS마다 상이한 경우도 있지만 0 혹은 1로 저장되는 경우가 많다. 이는 의미를 불명확하게 하여 보는 사람이 손쉽게 파악하기 어렵다는 단점이 있다.

그리하여 DB에 저장할때는 Y / N으로 변환하여 저장해 주면 파악하기 좋아진다는 장점이 있다.

이 경우 뿐만아니라 DB에서 불러올 때 저장할 때 암호화/복호화하는 경우에도 사용 가능하기도 하다. 

저장할 때 직접 변환해서 저장하고, 조회할 때 변환해서 가져오는 로직을 추가하여 사용할 수 있지만 그보다는 엔티티의 속성 자체에 Converter를 넣어주어 자동으로 변환되도록 하면 유지보수는 물론 보기에도 좋은 코드가 된다.

 

간단하게 말하면 객체의 속성과 DB의 컬럼 데이터를 매핑할 때 자동으로 변환해 주는 기능을 한다.

 

사용방법

사용 방법은 그리 어렵지 않다. 

@Converter 정의

더보기

AttributeConverter 인터페이스 살펴보기

package javax.persistence;

/**
 * A class that implements this interface can be used to convert 
 * entity attribute state into database column representation 
 * and back again.
 * Note that the X and Y types may be the same Java type.
 *
 * @param <X>  the type of the entity attribute
 * @param <Y>  the type of the database column
 */
public interface AttributeConverter<X,Y> {

    /**
     * Converts the value stored in the entity attribute into the 
     * data representation to be stored in the database.
     *
     * @param attribute  the entity attribute value to be converted
     * @return  the converted data to be stored in the database 
     *          column
     */
    public Y convertToDatabaseColumn (X attribute);

    /**
     * Converts the data stored in the database column into the 
     * value to be stored in the entity attribute.
     * Note that it is the responsibility of the converter writer to
     * specify the correct <code>dbData</code> type for the corresponding 
     * column for use by the JDBC driver: i.e., persistence providers are 
     * not expected to do such type conversion.
     *
     * @param dbData  the data from the database column to be 
     *                converted
     * @return  the converted value to be stored in the entity 
     *          attribute
     */
    public X convertToEntityAttribute (Y dbData);
}
  1. AttributeConverter<x, y="">를 implements 해주기 </x,>
    • 이때 X는 엔티티의 타입, Y는 DB안에 저장되어 있는 타입
  2. 두 개의 메서드를 정의해 주어야 한다.
    • Y converToDatabaseColumn(X attribute)은 엔티티에서 DB로 저장할 때 변환할 로직을 넣어주면 된다.
    • X convertToEntityAttribute(Y dbData)는 DB에서 엔티티로 데이터를 가져올 때 적용할 로직을 넣어주면 된다.

예를 들어 YN값을 저장하는 컬럼을 Boolean값으로 변환하는 컨버터는 다음과 같다.

import javax.persistence.AttributeConverter;
import javax.persistence.Converter;

/* DB에서 YN으로 관리하는 데이터 boolean값으로 변환하기 */
@Converter
public class BooleanToYNConverter implements AttributeConverter<Boolean, Character> {
    @Override
    public Character convertToDatabaseColumn(Boolean attribute) {
        return (attribute != null && attribute) ? 'Y' : 'N';
    }

    @Override
    public Boolean convertToEntityAttribute(Character dbData) {
        if(dbData == null) return false;
        return 'Y' == dbData || 'y' == dbData;
    }
}

만약 모든 Boolean 타입에 자동으로 적용이 되도록 만들고 싶다면 @Converter(autoApply = true)로 변경해 주면 된다.

@Target({TYPE}) @Retention(RUNTIME)
public @interface Converter {
     boolean autoApply() default false;
}

 

@Convert 사용

변환을 원하는 속성 위에 @Convert(converter = 컨버터.class)를 달아주기만 하면 간편하게 적용이 된다.

import lombok.*;

import javax.persistence.*;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Builder
@Entity
@Table(name = "factory_floor")
public class ExampleEntity {
    @Id
    private int no;

    @Convert(converter = BooleanToYNConverter.class)
    @Column(name = "use_yn")
    private boolean useYn;
}

 

 

반응형