728x90
@Converter
public class BooleanToTrueFalseConverter implements AttributeConverter<Boolean, String> {
@Override
public String convertToDatabaseColumn(Boolean attribute) {
return attribute != null ? attribute.toString() : null;
}
@Override
public Boolean convertToEntityAttribute(String dbData) {
return dbData != null ? Boolean.valueOf(dbData) : null;
}
}
전체 엔티티에 Boolean to Y/N 변환을 적용하면서 특정 컬럼은 제외하는 방법에 대해 설명해 드리겠습니다. 이를 위해 몇 가지 접근 방식을 사용할 수 있습니다.
- 커스텀 어노테이션을 사용하는 방법
먼저, 변환을 제외할 필드를 표시하기 위한 커스텀 어노테이션을 만듭니다:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface ExcludeYNConversion {}
그리고 BooleanToYNConverter 클래스를 수정하여 이 어노테이션을 확인하도록 합니다:
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
@Converter(autoApply = true)
public class BooleanToYNConverter implements AttributeConverter<Boolean, String> {
@Override
public String convertToDatabaseColumn(Boolean attribute) {
if (shouldSkipConversion()) {
return attribute != null ? attribute.toString() : null;
}
return (attribute != null && attribute) ? "Y" : "N";
}
@Override
public Boolean convertToEntityAttribute(String dbData) {
if (shouldSkipConversion()) {
return dbData != null ? Boolean.valueOf(dbData) : null;
}
return "Y".equals(dbData);
}
private boolean shouldSkipConversion() {
try {
String fieldName = JPAHelperUtil.getAttributeName();
Class<?> entityClass = JPAHelperUtil.getEntityClass();
return entityClass.getDeclaredField(fieldName).isAnnotationPresent(ExcludeYNConversion.class);
} catch (Exception e) {
return false;
}
}
}
이 코드에서 JPAHelperUtil은 현재 변환 중인 엔티티와 필드 정보를 가져오는 유틸리티 클래스입니다. 이 클래스의 구현은 사용 중인 JPA 구현체에 따라 다를 수 있습니다.
이제 엔티티에서 다음과 같이 사용할 수 있습니다:
@Entity
public class SomeEntity {
@Id
private Long id;
private Boolean active; // Y/N으로 변환됨
@ExcludeYNConversion
private Boolean verified; // true/false로 저장됨
// 생성자, getter, setter 등
}
- 별도의 컨버터를 사용하는 방법
특정 필드에 대해 다른 컨버터를 명시적으로 지정할 수 있습니다:
@Converter
public class BooleanToTrueFalseConverter implements AttributeConverter<Boolean, String> {
@Override
public String convertToDatabaseColumn(Boolean attribute) {
return attribute != null ? attribute.toString() : null;
}
@Override
public Boolean convertToEntityAttribute(String dbData) {
return dbData != null ? Boolean.valueOf(dbData) : null;
}
}
그리고 엔티티에서 이렇게 사용합니다:
@Entity
public class SomeEntity {
@Id
private Long id;
private Boolean active; // Y/N으로 변환됨
@Convert(converter = BooleanToTrueFalseConverter.class)
private Boolean verified; // true/false로 저장됨
// 생성자, getter, setter 등
}
- 타입 변경 방법
변환을 원하지 않는 필드의 타입을 Boolean에서 boolean 프리미티브 타입으로 변경할 수 있습니다. autoApply = true로 설정된 컨버터는 프리미티브 타입에는 적용되지 않습니다:
@Entity
public class SomeEntity {
@Id
private Long id;
private Boolean active; // Y/N으로 변환됨
private boolean verified; // true/false로 저장됨
// 생성자, getter, setter 등
}
각 방법의 장단점:
- 커스텀 어노테이션 방식: 가장 유연하지만, 구현이 복잡하고 성능에 영향을 줄 수 있습니다.
- 별도 컨버터 사용: 명확하고 직관적이지만, 각 필드마다 어노테이션을 추가해야 합니다.
- 타입 변경: 가장 간단하지만, null 값을 처리할 수 없습니다.
728x90
'IT 개발 > JPA' 카테고리의 다른 글
[JPA] Boolean 값을 Y, N 값으로 사용하기 - 3 (2) | 2024.09.04 |
---|---|
[JPA] Boolean 값을 Y, N 값으로 사용하기 - 2 (1) | 2024.09.04 |
[JPA] Boolean 값을 Y, N 값으로 사용하기 - 1 (2) | 2024.09.04 |
[JPA] JPA로 데이터 삭제시 삭제 여부 컬럼 이용 방법 (0) | 2024.09.04 |