yehey's 공부 노트 \n ο(=•ω<=)ρ⌒☆

[spring boot] JPA table에 Boolean column 추가하기 본문

개발/프로젝트

[spring boot] JPA table에 Boolean column 추가하기

yehey 2024. 1. 21. 17:00

이슈

가계부 내역에 통계 제외 기능을 추가해달라는 요청이 있었다.

 

통계 제외 기능 추가에는 2가지 방법 정도 생각해봤다.

 

1. 현재 있는 Tag 테이블에 통계제외 태그를 추가해서 해당 태그를 기반으로 통계 포함,제외 기능을 구현하기

2. 내역 테이블에 통계 제외 컬럼을 추가해서 구현하기

 

두가지 중에서는 Tag 테이블을 이용하는 것 보다 내역 테이블에 컬럼을 추가하는게 더 좋을 것 같다고 판단했다.

내역 테이블에 통계 제외 컬럼을 추가하는 것 보다 태그-내역 관계 테이블에서 통계 제외가 포함되는지 확인하는 로직이 더 복잡할 것 같다고 생각했다.
그래서 내역 테이블에 isExcluded 라는 컬럼을 생성하기로 했음 그리고 해당 컬럼의 값을 Boolean 즉 true, false 로 값을 넣고 싶었다.

Contents

JPA에서 entity 테이블을 만들 때 Boolean 으로 타입을 명시해도 MySQL 에서는 TINYINT(1) 로 컬럼이 생성된다. 그래서 컬럼에 값은 0,1 로 저장된다. 내가 원했던 동작은 코드상에서는 Boolean으로 사용 가능하고, DB 상에서는 bit 로 동작했으면 했다.

이를 위해 AttributeConverter 를 생성해서 isExcluded 컬럼에 컨버터를 적용해줬다.

Practice

@Converter
public class BooleanAttributeConverter implements AttributeConverter<Boolean,Integer> {

    @Override
    public Integer convertToDatabaseColumn(Boolean attribute) {
        if(attribute){
            return 1;
        }else{
            return 0;
        }
    }

    @Override
    public Boolean convertToEntityAttribute(Integer dbData) {
        return dbData != 0;
    }
}

 

위와 같이 Boolean attribute Converter 클래스를 AttributeConverter 인터페이스를 구현하는 방식으로 생성해준다. 

이때 AttributeConverter<X,Y> 의 X는 객체로서 사용할 타입을 Y는 DB 컬럼에 들어갈 타입을 명시해준다.

 

- convertToDatabaseColumn: X 타입을 받아서 적절한 처리 후 DB 컬럼에 들어갈 타입으로 변환한 값을 반환하는 로직을 추가한다. (object -> DB)

- convertToEntityAttribute: DB의 값(Y 타입)을 받아서 객체로 사용할 값으로 반환하는 로직을 추가한다. (DB -> object)

 

원하는 형식으로 컨버터를 만들어준다. 여기서는 Boolean을 객체 타입으로 지정했지만 Enum 이나 일반 String 등 다양하게 응용, 적용할 수 있다.

 

//entity
    ...

    @Column(name="is_excluded",nullable = false,columnDefinition = "TINYINT",length = 1)
    @Convert(converter = BooleanAttributeConverter.class)
    @ColumnDefault("0")
    private Boolean isExcluded;

    ...

 

생성한 컨버터는 위와 같이 적용해준다. (여기서는 Boolean 컬럼을 TINYINT(1)로 bit로 저장하게끔 했다. 기본 값은 0(false)로 컬럼이 업데이트 된다.) 

//entity response DTO

@Getter
@Builder
public class LedgerResponseDTO {
    ...
    private Boolean isExcluded;
}

// response logic 일부

Ledger ledger = ledgerRepository.getReferenceById(ledgerID);
return LedgerResponseDTO.builder().isExcluded(ledger.getIsExcluded()).build();

 

사용할 때는 처음부터 Boolean 객체인 것 처럼 불러다가 쓸 수 있다. 

 

 

api 상에서 사용하거나 응답할 때도 Boolean으로 받고, 응답할 수 있다.

Learned

AttributeConverter를 구현해보고 적용해보았다. 현재는 Boolean만 저장했고 0,1 bit 로 저장했으나 필요하다면 Enum, String 등의 컨버터도 생성할 수 있게 되었다. DB 설계,구현에 더 나은 선택지가 생겼다! 좀 더 원하는만큼 만들 수 있을 것 같은 자신감!이 붙었다 (곧 꺾일 예정)

참조

https://memostack.tistory.com/194#article-2--entity%EC%97%90-%EC%BB%A8%EB%B2%84%ED%84%B0-%EC%A0%81%EC%9A%A9

 

Spring Boot, JPA에서 boolean 처리 (@Converter, @Convert 사용)

엔티티에서는 java의 boolean을 사용하고, Database에서는 Y 또는 N으로 처리하고 싶을때, @Converter 어노테이션을 사용하여 해결할 수 있다. 컨버터 객체 생성 BooleanToYNConverter.java @Converter public class Boolea

memostack.tistory.com

https://rachel0115.tistory.com/entry/JPA-JPA-AttributeConverter%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-%EC%9E%90%EB%8F%99%EC%9C%BC%EB%A1%9C-%EA%B0%92%EC%9D%84-%EB%B3%80%ED%99%98%ED%95%98%EA%B8%B0

 

[JPA] JPA AttributeConverter를 사용하여 자동으로 변환된 값을 바인딩하기

🔖 개요 DB에 어떤 값을 저장할 때 전/후처리가 필요한 요구사항이 있을 수 있다. 예를 들어, 사용자의 개인 정보를 암호화해서 저장하는 경우 혹은 데이터베이스에 저장된 값을 불러올 때 Static

rachel0115.tistory.com

 

Comments