@Enumerated 보다 @Convert 가 권장되는 이유 + 예제코드Back-end/- Spring2024. 10. 25. 00:32
Table of Contents
용어정리
Enum Class
열거형(Enum)을 정의하는 데 사용되며, 고정된 상수들의 집합이다
특별한 데이터 타입이고 특정 값들만 가질 수 있는 변수를 정의할 때 사용된다
@Enumerated
Entity 필드의 Enum타입을 DB에 어떻게 매핑할 것인지 정해주는 어노테이션
@Convert
Entity의 필드타입을 변환하여 DB에 저장하거나 DB에서 읽어 올 때 변환 작업을 지정하는 어노테이션임
커스텀 컨버터 로직을 직접 작성해서 사용한다.
@Enumerated 보다 @Convert가 권장되는 이유는?
먼저 @Enumerated의 속성을 알아야 한다.
1. EnumType.ORDINAL
2.EnumType.STRING
이렇게 총 두 가지인데 사실 EnumType.ORDINAL을 사용하는 건 서비스의 안정성을 매우 저하시킨다
ORDINAL 속성은 enum클래스의 데이터들의 순서에 맞게 번호를 입력하는 기능을 담당하는데
만약 데이터가 추가되거나 변경 시 데이터들의 순서가 변경이 되고 또한 순서가 변하게 된다
그렇게 된다면 같은 데이터라도 enum 클래스에 있는 속성과 DB에 저장된 순서가 미스매치가 되는 상황이 생긴다.
이러한 경우 때문에 Enumerated 어노테이션으로는 해결하지 못한다
즉 양방향으로 변환(data -> code, code -> data)되는 변환기가 필요하다.
@Convert 예제 코드
public Enum Stat{
Fine(1),
BAD(2);
private Integer code;
Enum(Integer code){
this.code = code;
}
public Integer getCode(){
return code;
}
public static Stat ofLefacyCode(Integer code){
for(Stat stat : Stat.values()){
if(code == stat.getCode()){
return stat;
}
}
throw new IllegalArgumentException("Error!")
}
}
@Converter(autoApply = true)
public class StatConverter implements AttributeConverter<Stat, Integer>{
@Override
public Integer convertToDatabaseColumn(Stat stat){
if(!Objects.isNull(stat)){
return stat.getCode();
}
throw new IllgalArgumentException("Error!");
}
@Override
public Stat convertToEntityAttribute(Integer code){
if(!Objects.isNull(code)){
return Stat.ofLegacyCode(code);
}
throw new IllegalArgumentException("Errorr!!!");
}
}
AttributeConverter <K, V> 인터페이스를 사용해서 변환기를 만든 코드이다
stat -> code, code -> stat으로 양방향 변환이 가능하다
'Back-end > - Spring' 카테고리의 다른 글
DTO, DAO가 무엇일까? with 사용하는 이유 (0) | 2024.09.23 |
---|---|
SpringBoot 빌드(Build) 및 실행하기 (Mac, Gradle) (0) | 2024.05.01 |
@Koben :: KOBEN
나만의 개발 데이터베이스!
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!