데이터베이스에서 Y / N 과 어플리케이션의 Boolean 처리

Jobmania·2023년 6월 26일
0

JPA (Baeldung 실습)

목록 보기
3/3
post-thumbnail

데이터 베이스의 값과 어플리케이션에서 Boolean은 어떻게 호환이 되는가?

여러 데이터베이스에서는 boolean의 표현을 다양하게 하고 있다.

  • MySql은 0은 false, 1은 true
  • PostgreSQL은 't','true','y','yes','on','1'에 대해서 true를
    'f','false','n','no','off','0'에 대해 false로 인식을 한다고 한다.

MySQL에서는 Y, N으로만 저장되어 있는 값을 어플리케이션에서 Boolean타입으로 값을 조회하면 아래와 같은 값이 나온다.

데이터 베이스를 생성할때 Y,N에 대해서 Boolean 타입으로 설정하지 않았다.
어째서 어플리케이션은 해당 값을 true/false로 처리할 수 있었을까?

답은 하이버네이트다!
하이버네이트의 다양한 boolean 처리

// the old way
@Type(type = "org.hibernate.type.YesNoBooleanType")
private boolean myValue;

해당 값을 yes, no를 통해 true, false로 처리를 할 수 있다.

Hibernate 5.2 이상 버전에서는 @Convert 어노테이션을 사용하여 데이터베이스 값의 변환을 처리할 수 있고, 이방법을 추천한다

package son.roomshare.converter;

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

@Converter
public class YesNoConverter  implements AttributeConverter<String, Boolean> {

 // 엔티티의 데이터를 데이터베이스 컬럼에 저장할 데이터로 변환
    @Override
    public Boolean convertToDatabaseColumn(String attribute) {
        return "Y".equals(attribute);
    }
// 데이터베이스에서 조회한 컬럼 데이터를 엔티티의 데이터로 변환
    @Override
    public String convertToEntityAttribute(Boolean dbData) {
        return dbData ? "Y" : "N";
    }
}

해당 컨버터 클래스를 생성하고 적용하고자 하는 필드에 해당 어노테이션을 작성하면 된다.

 @Convert(converter = YesNoConverter.class)
 private Boolean parkingAvailable;

추가로 @Convert 대상 class에는 Setter를 생성해야한다.

그러지 않으면 리플렉션을 사용하여 필드 값을 설정하는 과정에서 문제가 발생한다.

org.springframework.orm.jpa.JpaSystemException: 
Could not set field value [Y] value by reflection
  • 접근 제어 문제로 private이거나 protected로 설정되어 있어 필드에 접근할 수 없는 경우 발생할 수 있다. 다만 getter, setter를 사용하여 설정 가능하다. 다만
    Setter 메서드 누락이 되었다면 올바르게 구현되어 있지 않은 경우에도 이러한 오류가 발생할 수 있다. Setter 메서드가 필드 값을 설정하는 역할을 담당하므로, Setter를 통해 필드값을 설정하고 이후 해당 도메인에 Setter를 제거하면 된다.

참고

profile
HelloWorld에서 RealWorld로

0개의 댓글