Spring/Spring JPA

[JPA] ENUM 타입

개발자잡 2024. 11. 12. 17:52

JPA에서 enum 타입은 데이터베이스 컬럼에 매핑할 때 @Enumerated 어노테이션을 사용하여 처리할 수 있습니다. enum은 코드의 가독성을 높이고, 특정 값 집합을 제한하는 데 유용하기 때문에 JPA에서도 널리 사용됩니다. @Enumerated 어노테이션은 enum 필드를 데이터베이스에 저장할 때 어떤 방식으로 저장할지 결정합니다. 두 가지 주요 전략이 있습니다:

1. EnumType.ORDINAL

  • enum의 순서(인덱스 값)를 저장합니다. 즉, enum의 정의된 순서에 따라 0, 1, 2와 같은 정수 값으로 저장됩니다.
  • 장점: 저장 공간이 작으며, 데이터베이스에 인덱스 값을 저장하므로 효율적일 수 있습니다.
  • 단점: enum 순서가 바뀌거나 새로운 값이 추가되면 기존 데이터가 잘못 매핑될 위험이 있습니다.
@Enumerated(EnumType.ORDINAL)
private Status status;

 

2. EnumType.STRING

  • enum의 이름을 그대로 문자열로 저장합니다.
  • 장점: enum의 순서가 바뀌거나 새로운 값이 추가되더라도 데이터 무결성이 유지됩니다. 코드 가독성이 좋고, 데이터베이스에서 더 직관적으로 이해할 수 있습니다.
  • 단점: 저장 공간이 더 많이 필요할 수 있습니다.
@Enumerated(EnumType.STRING)
private Status status;

 

public enum Status {
    ACTIVE,
    INACTIVE,
    DELETED
}

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @Enumerated(EnumType.STRING)
    private Status status;

    // Getters and Setters
}

 

위 코드에서 User 엔티티의 status 필드는 Status라는 enum 타입입니다. @Enumerated(EnumType.STRING) 어노테이션은 status 필드가 데이터베이스에 ACTIVE, INACTIVE, DELETED와 같은 문자열로 저장됨을 의미합니다. EnumType.ORDINAL을 사용했다면 0, 1, 2와 같이 enum의 인덱스 값으로 저장됩니다.

선택 기준

  • **EnumType.STRING**을 권장합니다. 코드의 변경이 일어나더라도 데이터의 무결성을 유지할 수 있기 때문입니다. ORDINAL을 사용하면 enum 순서가 변경될 경우 데이터가 잘못 매핑될 수 있습니다.

JPA에서 enum을 효율적으로 활용하면 명확한 상태 관리와 제한된 값 처리가 가능해집니다.