일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 운정 소바동
- graphql with reactnative
- 고르드
- promise메서드
- promise처리
- 비동기배열처리방법
- 도그존
- 예쁜술집 예술
- 비동기배열
- 지보싶 신촌점
- graphql
- 잠실새내 도그존
- 앙버터마카롱
- apollo react native
- graphql react native
- 잠실새내
- 홍대 예술
- graphql with RN
- 토라비
- graphql 400
- 홍대 카페 장쌤
- 화이트해커를 위한 웹 해킹의 기술
- 신촌 소문난집
- apolloclient
- 홍대 토라비
- graphql mutation error
- 금별맥주
- useMutation error
- typescript
- 화이트 해커를 위한 웹 해킹의 기술
- Today
- Total
yehey's 공부 노트 \n ο(=•ω<=)ρ⌒☆
[spring boot] JPA table에 Boolean column 추가하기 본문
이슈
가계부 내역에 통계 제외 기능을 추가해달라는 요청이 있었다.
통계 제외 기능 추가에는 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 설계,구현에 더 나은 선택지가 생겼다! 좀 더 원하는만큼 만들 수 있을 것 같은 자신감!이 붙었다 (곧 꺾일 예정)
참조
'개발 > 프로젝트' 카테고리의 다른 글
[Next js] recoil 전역 상태관리 적용하기 (0) | 2024.01.17 |
---|---|
[BE/spring boot] JPA ManyToMany 테이블 수정하기 (1) | 2024.01.07 |
[Next js/react-query] react query 설치 및 적용하기 (0) | 2023.12.31 |
[FE/next js] 프론트 스택 정하기 및 next js 설치 (app router) (0) | 2023.12.17 |
[BE/spring boot] custom Response DTO 만들기 (0) | 2023.12.15 |