Spring/Annotations

@Enumerated ?

Geisha 2025. 1. 8. 18:50
Inflearn 강의 도중 @Enumerated 라는 어노테이션을 마주했고
이는 처음보는 어노테이션이었기에 짚고 넘어가고 싶었습니다. 
마주한 코드는 다음과 같습니다.


@Enumerated

@EnumeratedJPA(Java Persistence API)에서 사용되는 어노테이션으로,

Enum 타입을 데이터베이스에 매핑할 때 사용됩니다.

 

Enumerated 어노테이션은 (EnumType.String) 구문을 통해서
Enum 타입을 데이터베이스 컬럼Enum 값을 숫자(Ordinal)로 저장할지, 문자열(String)로 저장할지를 결정하고,

JPA 엔티티 클래스에서 Enum 필드를 데이터베이스와 매핑할 때 필요하게 됩니다.


@Enumerated의 주요 옵션

@Enumerated는 EnumType이라는 설정값을 통해 작동하며, 두 가지 옵션을 제공합니다:

1. EnumType.ORDINAL

  • Enum의 순서를 기반으로 숫자를 저장합니다.
  • 순서는 0부터 시작하며, Enum의 정의 순서대로 매겨집니다.
public enum OrderStatus {
    PENDING, COMPLETED, CANCELLED;
}

 

 

  • PENDING → 0
  • COMPLETED → 1
  • CANCELLED → 2

아래는 Entity 클래스에 설정하는 방법입니다.

@Entity
public class Order {
    @Enumerated(EnumType.ORDINAL)
    private OrderStatus status;
}

 

 

이러면 데이터베이스에

 

이러한 값이 저장되게 되지만

Enum의 순서를 변경하거나 새로운 값이 중간에 추가되면 기존 데이터와 불일치 문제가 발생할 수 있게 됩니다.

따라서 데이터 무결성을 보장하기 어렵기 때문에 잘 사용되지 않는다고 합니다.

다음은 2번째 타입입니다.

2. EnumType.STRING

  • Enum의 이름(String)을 저장합니다.
  • Enum의 순서에 의존하지 않아 안전합니다.

아래의 방식으로 설정되게 됩니다.

@Entity
public class Order {
    @Enumerated(EnumType.STRING)
    private OrderStatus status;
}

 

그 결과는 데이터베이스에

 

위와같이 저장되게 되고 이는 Enum의 값의 순서와 상관없이 안전하게 저장되기 때문에

읽기 및 유지보수가 더 직관적이게 됩니다.