티스토리 뷰

Java/JPA

<JPA> @Enumerated 사용 시 주의할 점

면목동인간 2024. 10. 31. 22:13

@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);

// 커밋 생략

 

실행 결과

h2 데이터베이스 환경에서 실행

 위의 실행 결과를 보면 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 - 웹 애플리케이션 개발 편/인프런”를 학습한 내용을 정리한 것

댓글
최근에 올라온 글
«   2026/03   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함
Total
Today
Yesterday