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
반응형

+ Recent posts