본문 바로가기
IT 개발/JPA

[JPA] Boolean 값을 Y, N 값으로 사용하기 - 4

by 이것 저것 모든것 2024. 9. 4.
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 변환을 적용하면서 특정 컬럼은 제외하는 방법에 대해 설명해 드리겠습니다. 이를 위해 몇 가지 접근 방식을 사용할 수 있습니다.

  1. 커스텀 어노테이션을 사용하는 방법

먼저, 변환을 제외할 필드를 표시하기 위한 커스텀 어노테이션을 만듭니다:

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 등
}
 
  1. 별도의 컨버터를 사용하는 방법

특정 필드에 대해 다른 컨버터를 명시적으로 지정할 수 있습니다:

@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 등
}
 
  1. 타입 변경 방법

변환을 원하지 않는 필드의 타입을 Boolean에서 boolean 프리미티브 타입으로 변경할 수 있습니다. autoApply = true로 설정된 컨버터는 프리미티브 타입에는 적용되지 않습니다:

@Entity
public class SomeEntity {
    @Id
    private Long id;

    private Boolean active;  // Y/N으로 변환됨

    private boolean verified;  // true/false로 저장됨

    // 생성자, getter, setter 등
}

 

각 방법의 장단점:

  1. 커스텀 어노테이션 방식: 가장 유연하지만, 구현이 복잡하고 성능에 영향을 줄 수 있습니다.
  2. 별도 컨버터 사용: 명확하고 직관적이지만, 각 필드마다 어노테이션을 추가해야 합니다.
  3. 타입 변경: 가장 간단하지만, null 값을 처리할 수 없습니다.
728x90