728x90
반응형
@Enumerated 어노테이션으로 사용할 땐 다음과 같이 저장하는 방법이 있다.
- ORDINAL
- STRING
STRING으로 저장하면 한 눈에 알기 쉽지만 아무래도 Interger로 저장하는 것보다 데이터의 용량이 많아진다.
ORDINAL로 저장하는 것은 데이터 용량은 적지만 순서가 무조건 0부터 시작되고, 저장되는 값을 커스터마이징하기가 힘들며 나중에 관리하기가 힘들다.
가장 좋은 방법은
- 데이터를 저장할 때는 name에 맞는 value를 Interger로 저장한다.
- 데이터를 불러올 때는 저장된 value에 맞는 name을 불러온다.
이거다. 쓰는 방법을 알아보자.
참고 -> Persisting Enums in JPA | Baeldung
- 기본 Enum
public enum Category {
SPORT("S"), MUSIC("M"), TECHNOLOGY("T");
private String code;
private Category(String code) {
this.code = code;
}
public String getCode() {
return code;
}
}
1. 기존 @Enumerated 어노테이션을 삭제한다.
private Category category;
2. Converter 를 만들어준다.
@Converter(autoApply = true)
public class CategoryConverter implements AttributeConverter<Category, String> {
@Override
public String convertToDatabaseColumn(Category category) {
if (category == null) {
return null;
}
return category.getCode();
}
@Override
public Category convertToEntityAttribute(String code) {
if (code == null) {
return null;
}
return Stream.of(Category.values())
.filter(c -> c.getCode().equals(code))
.findFirst()
.orElseThrow(IllegalArgumentException::new);
}
}
3. 상속관계에 포함된 Entity라면 다음과 같이 바꿔준다.
- 부모 Entity ( dtype의 자료형을 Interger로 바꿈 )
@DiscriminatorColumn(name = "item", discriminatorType = DiscriminatorType.INTEGER)
- 자식 Entity ( 숫자로 바꾸면 저장할 때 Interger로 저장됨 )
@DiscriminatorValue("1")
728x90
반응형
'Back-End > Spring Boot' 카테고리의 다른 글
SpringBoot | List to DtoList ( Stream ) (0) | 2023.05.18 |
---|---|
Spring Boot | QueryDsl 잘 사용하는 팁 (0) | 2023.05.18 |
Spring Boot | Jpa Postgres Json Column (0) | 2023.05.03 |
Spring Boot | Java Map 반복문 쓰는법 (0) | 2023.04.19 |
Spring Boot | ManyToOne Fetch Join 으로 Object 불러오기 (0) | 2023.04.17 |