장단점
- 장점: 사용자 정의 컨버터, 즉
JPA Converter
를 상황에 맞게 정의하여 복잡한 타입을 간단한 타입으로 변환할 수 있다 !
- 단점: 변환 로직을 직접 구현해야 하며, 잘못 구현하면
데이터 일관성
에 문제가 생길 수 있다.
사용법
@Converter
애너테이션은 이 클래스가 JPA Converter
임을 나타낸다.
AttributeConverter
인터페이스를 구현하고 있다.
→ 이 인터페이스는 두 개의 제네릭 타입을 받는데, 첫 번째는 엔티티 속성의 타입 (List<CommonCondition>)
, 두 번째는 이 속성을 데이터베이스에 저장할 때 사용할 타입(String)
입니다.
코드 설명
List<CommonCondition>
가 [DIZZYINESS, WEAKNESS]
라면, 이 리스트는 데이터베이스에 "DIZZYINESS, WEAKNESS"
로 저장됩니다.
- 반대로
"DIZZYINESS, WEAKNESS"
라는 문자열이 데이터베이스에 저장되어 있다면, 이를 다시[DIZZYINESS, WEAKNESS]
리스트로 변환
// CommonConditionConverter.java
package inatools.backend.converter;
import inatools.backend.domain.CommonCondition;
import jakarta.persistence.AttributeConverter;
import jakarta.persistence.Converter;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
@Converter
public class CommonConditionConverter implements AttributeConverter<List<CommonCondition>, String> {
@Override
public String convertToDatabaseColumn(List<CommonCondition> attribute) {
if (attribute == null || attribute.isEmpty()) {
return "";
}
return attribute.stream()
.map(Enum::name)
.collect(Collectors.joining(","));
}
@Override
public List<CommonCondition> convertToEntityAttribute(String dbData) {
if (dbData == null || dbData.isEmpty()) {
return List.of();
}
return Arrays.stream(dbData.split(","))
.map(CommonCondition::valueOf)
.collect(Collectors.toList());
}
}