티스토리 뷰
@Enumerated이란?
Java의 ENUM 타입을 DB로 저장한다. 저장 방법은 두 가지가 있는데, 첫 번째는 ENUM 값의 위치로 저장하는 방법. 두 번째는 ENUM 값을 문자열로 DB에 저장하는 방법이 있다.
@Enumerated 사용 시 주의할 점
@Enumerated 사용 시 주의할 점이 있는데 @Enumerated은 기본 값이 EnumType.ORDINAL(ENUM 값의 위치로 저장)이다. 만약 기본 값으로 저장할 때 어떤 문제가 발생하는지 아래 예제를 통해 알아보았다.
문제점 예제
Member.java
@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
@Column(name = "user_name")
private String userName;
// 기본 값이 EnumType.ORDINAL(위치로 저장)
@Enumerated
@Column(name = "member_grade")
private MemberGrade memberGrade;
// getter,setter 생략
}
MemberGrade.java (ENUM)
public enum MemberGrade {
// 회원 등급
A, B
}
EnumeratedMain.java
// 엔티티 매니저 생략
Member memberA = new Member();
memberA.setUserName("memberA");
memberA.setMemberGrade(MemberGrade.A);
// 회원 저장
em.persist(memberA);
// 커밋 생략
실행 결과

위의 실행 결과를 보면 MEMBER_GRADE 컬럼 값에 0이 들어갔다. 그 이유는 MemberGrade에 있는 A의 위치가 1번째에 있기 때문이다. (실제로는 0부터 순서대로 저장된다. A-0, B-1...) 만약 기본 값인 ORDINAL로 저장한다면 문제가 발생하는데 아래와 같다. (MEMBER_GRADE 타입은 tinyint으로 생성)
MemberGrade.java (ENUM)
public enum MemberGrade {
// 회원 등급
// S등급 새로 추가
S, A, B
}
위의 ENUM에서 S가 맨앞에 새로 추가하였다. 이 상태로 다시 실행하였더니 아래와 같다.
실행 결과

똑같이 등급을 A로 하였는데 MEMBER_GRADE 컬럼 값에 1이 들어갔다. 왜냐하면 S등급을 A등급 앞에 새로 추가하였기 때문에 A의 위치가 변하였고 DB에 들어갈 값도 같이 변경하였다. 문제를 해결하려면 @Enumerated 값을 EnumType .String으로 변경하면 된다.
해결 예제
Member.java
// String으로 변경
@Enumerated(EnumType.STRING)
@Column(name = "member_grade")
private MemberGrade memberGrade;
위의 코드를 보면 @Enumerated 값에 EnumType.STRING으로 변경하였다. 변경 후 실행 결과를 보면 아래와 같다.
실행 결과

MEMBER_GRADE 컬럼 값에 ENUM 값이 문자열로 들어갔다. (MEMBER_GRADE 컬럼 값은 varchar로 생성)
정리
@Enumerated은 기본 값이 EnumType.ORDINAL으로 되어있다. 이는 ENUM을 변경하면 순서가 변경되기 때문에 DB에 저장되는 값이 다르고 저장되었던 다른 레코드 값에도 영향을 미치기 때문에 되도록 EnumType.STRING으로 사용하는 것이 좋다.
본 포스팅은 “실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 편/인프런”를 학습한 내용을 정리한 것
'Java > JPA' 카테고리의 다른 글
| <JPA> 페이징 처리 (3) | 2024.11.07 |
|---|---|
| <JPA> 벌크 연산시 주의할 점 (2) | 2024.10.03 |
| <JPA> 준영속 엔티티를 수정하는 2가지 방법 (0) | 2024.09.30 |
| <JPA> 임베디드 타입이란? (0) | 2024.09.24 |
| <JPA> 즉시 로딩과 지연 로딩이란? (0) | 2024.09.23 |
