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을 효율적으로 활용하면 명확한 상태 관리와 제한된 값 처리가 가능해집니다.