
사이드 프로젝트 도중 회원이 프로필을 생성했는지 여부를 체크해주는 필드를 추가해야하는 경우가 발생했다.
필드를 추가하고 값으로 0,1을 저장해야할지.... true, false로 저장을 해줘야 할지 고민이 됐다.
DB 입장으로 봤을때는 전자가 더 좋은 선택일거 같고 개발자 입장에서는 후자가 좋을거 같다는 생각이 든다.
그러다가 생각이 든게 개발자는 boolean 형태로 저장을하면 DB에는 0,1으로 저장해주는 방법이 있지 않을까라는 생각이 들어서 찾아보니
@Converter 를 발견했다.
AttributeConverter 인터페이스
@Converter를 사용 할려면 AttributeConverter 인터페이스를 구현 해야 한다.
AttributeConverter를 살펴 봐보자

[ 인터페이스 주석 ]
이 인터페이스를 구현하는 클래스를 사용하여 엔티티 속성 상태를 데이터베이스 열 표현으로 변환하고 다시 되돌릴 수 있습니다.
X 및 Y 유형은 동일한 Java 유형일 수 있습니다.
X : 엔티티 속성의 유형
Y : 데이터베이스 열의 유형
convertToDatabaseColumn와 convertToEntityAttribute 메소드를 필수로 작성해줘야한다.
[ convertToDatabaseColumn 주석 ]
엔티티에 저장된 값을 데이터베이스에 저장할 데이터 표현으로 변환합니다.
매개변수: attribute – 변환할 엔티티 속성 값
반환: 데이터베이스 열에 저장할 변환된 데이터
[convertToEntityAttribute 주석]
데이터베이스 열에 저장된 데이터를 엔터티 속성에 저장할 값으로 변환합니다.
변환기 작성기는 JDBC 드라이버에서 사용할 해당 열의 올바른 dbData 유형을 지정해야 합니다.
즉, 지속성 제공자는 이러한 유형 변환을 수행하지 않을 것으로 예상됩니다.
매개변수: dbData – 변환할 데이터베이스 열의 데이터
반환: 엔티티 속성에 저장할 변환된 값
다른 글들은 이해가 되지만 "지속성 제공자는 이러한 유형 변환을 수행하지 않을 것으로 예상됩니다." 이 말은 무슨 말인지 이해를 못하겠다.
(혹시 아시는 분 있다면 답글로 알려주세요ㅠㅠ)
@Converter 적용
요구조건 : 사람의 이름을 입력할때 Entity에서는 이름과 성을 따로 입력하고 디비에는 "성, 이름" 형태로 저장

이름과 성을 가지고 있는 객체를 생성한다.

PersonName 유형의 속성을 @Entity 클래스 에 추가해준다.

convertToDatabaseColumn와 convertToEntityAttribute 메소드 들도 구현을 해준다.
convertToDatabaseColumn 메소드 부분을 간단하게 살펴보자면 매개 변수로 PersonName을 받는다.
PersonName의 이름과 성을 합쳐주는 작업을 하고 합쳐진 값을 반환 해준다.
convertToEntityAttribute는 db 값을 받은 다음 성과 이름을 분리 후 PersonName 에 각각 넣어주고
PersonName을 반환해준다.
여기서 끝은 아니다.

PersonName에 @Convert(converter = PersonNameConverter.class)을 붙여주면 완료된다.
참고 : https://www.baeldung.com/jpa-attribute-converters
'Spring > JPA' 카테고리의 다른 글
| JPA ) JPQL 문법 1 (0) | 2023.04.23 |
|---|---|
| JPA ) 객체지향 쿼리 언어 소개 (0) | 2023.04.23 |
| JPA ) 1:1 연관 관계 (0) | 2023.04.18 |
| JPA ) 연관관계 (0) | 2023.02.20 |
| JPA ) 플러시(Flush) 란? (0) | 2022.12.13 |