반응형
엔티티의 속성 중에 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);
}
- AttributeConverter<x, y="">를 implements 해주기 </x,>
- 이때 X는 엔티티의 타입, Y는 DB안에 저장되어 있는 타입
- 두 개의 메서드를 정의해 주어야 한다.
- 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;
}
반응형
'Library & Framework > JPA' 카테고리의 다른 글
[JPA] 생성일, 수정일 자동 기입 기능 추가하기 (AuditingEntityListener) (0) | 2023.07.09 |
---|---|
[JPA] 페이징 처리, Paging (Pagination, Infinite Scroll) (0) | 2023.06.21 |