JPA - Enum Type (@Enumerated, EnumType)

Kim Dae HyunΒ·2021λ…„ 7μ›” 23일
0

JPA

λͺ©λ‘ 보기
3/4
post-thumbnail

πŸ”Ž JPAκ°€ ENUM νƒ€μž…μ„ λ§€ν•‘μ‹œν‚€λŠ” 방법

JPAλŠ” Enum TypeκΉŒμ§€ DB둜 맀핑을 λ„μ™€μ€λ‹ˆλ‹€.
κ°„λ‹¨ν•œ Enum Type을 λ§Œλ“€μ–΄λ³΄κ³  직접 λ§€ν•‘κΉŒμ§€ ν•΄λ³Όκ»˜μš”.

μ‹€μŠ΅μ— μ‚¬μš©ν•œ Entity μž…λ‹ˆλ‹€.
편의λ₯Ό μœ„ν•΄ setterκΉŒμ§€ λͺ¨λ‘ μ—΄μ–΄μ£Όμ—ˆμŠ΅λ‹ˆλ‹€.

@Getter @Setter
@Entity
public class Member {
    @Id
    private Long id;

    @Column(name = "name")
    private String username;
    
    @Enumerated
    private RoleType roleType;
}

μš°μ„  Entity둜 Enumνƒ€μž…μ„ μ‚¬μš©ν•˜κ³  μ‹Άλ‹€λ©΄ @Enumerated μ–΄λ…Έν…Œμ΄μ…˜μ„ λΆ™μ—¬μ€˜μ•Ό ν•©λ‹ˆλ‹€.

κ°„λ‹¨ν•˜κ²Œ μž‘μ„±ν•œ Enum클래슀 μ½”λ“œμž…λ‹ˆλ‹€.

package com.dhk.domain;

public enum RoleType {
        ADMIN, USER, GUEST
}

λ‹€ μž‘μ„±ν•˜μ˜€μœΌλ‹ˆ 이제 DB에 직접 λ„£μ–΄λ³Όκ»˜μš”.

Member member = new Member();
member.setId(1L);
member.setUsername("kim");
member.setRoleType(RoleType.ADMIN);

em.persist(member);

μ‹€ν–‰ μ „ DB의 Member ν…Œμ΄λΈ”μ€ λΉ„μ–΄μžˆλŠ” μƒνƒœμž…λ‹ˆλ‹€.

μ •μƒμ μœΌλ‘œ insert쿼리가 μˆ˜ν–‰λ˜μ–΄ DB에 μ›ν•˜λŠ” 값이 λ“€μ–΄κ°”μŠ΅λ‹ˆλ‹€.

πŸ”Ž 주의

사싀 Enum Type을 μ‚¬μš©ν•˜λŠ”λ° 크게 어렀움은 μ—†μŠ΅λ‹ˆλ‹€.
ν•˜μ§€λ§Œ ν•˜λ‚˜ μ£Όμ˜ν•΄μ•Ό ν•  사항이 μžˆμŠ΅λ‹ˆλ‹€.

μœ„ μ‹€μŠ΅μ½”λ“œμ—μ„œ Entity 클래슀λ₯Ό ꡬ성할 λ•Œ Enum νƒ€μž…μ„ μ§€μ •ν•˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜μΈ @Enumerated에 μ•„λ¬΄λŸ° 섀정을 해주지 μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

μ΄λ ‡κ²Œ μ•„λ¬΄λŸ° 섀정을 해주지 μ•Šμ•˜μ„ λ•Œ @Enumerated의 λ””ν΄νŠΈ 섀정값은 EnumType.ORDINALμž…λ‹ˆλ‹€.

ORDINAL은 ENUM νƒ€μž…μ˜ 값을 μƒμˆ˜λ‘œ μ €μž₯ν•©λ‹ˆλ‹€.
μ‹€μŠ΅μ— μ‚¬μš©ν•œ ENUM 클래슀λ₯Ό λ‹€μ‹œ λ³΄μ‹€κ»˜μš”.

package com.dhk.domain;

public enum RoleType {
        ADMIN, USER, GUEST
}

EnumType.ORDINAL을 μ‚¬μš©ν•  λ•Œ μ‹€μ œ enum type의 값은

  • ADMIN = 0
  • USER = 1
  • GUEST = 2

이렇기 λ•Œλ¬Έμ— μœ„ μ˜ˆμ œμ—μ„œ RoleType.ADMIN을 μ €μž₯ν–ˆμ„ λ•Œ DB에 0이 μ €μž₯된 것 μž…λ‹ˆλ‹€.

이런 상황을 κ°€μ •ν•΄λ³Όκ»˜μš”.

μš”κ΅¬μ‚¬ν•­μ΄ λ³€κ²½λ˜μ–΄ RoleType에 VIPκ°€ 0λ²ˆμ§Έμ— μΆ”κ°€λ˜λŠ” μƒν™©μž…λ‹ˆλ‹€.

public enum RoleType {
        VIP, ADMIN, USER, GUEST
}

μ΄λ ‡κ²Œ Enum 클래슀λ₯Ό λ³€κ²½ν•˜κ³  VIP λ₯Ό RoleType으둜 ν•˜λŠ” Memberλ₯Ό μΆ”κ°€μ‹œμΌœλ³Όκ»˜μš”.

DB의 ROLETYPE 칼럼의 값이 μ€‘λ³΅λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
μƒμˆ˜λ‘œ ENUMνƒ€μž…μ„ μ €μž₯ν•˜λ©΄ 이와 같이 λ³€κ²½μ‹œ 였λ₯˜μ˜ κ°€λŠ₯성이 μƒκΉλ‹ˆλ‹€.

λ•Œλ¬Έμ— λ°˜λ“œμ‹œ ENUM νƒ€μž…μ„ String으둜 μ €μž₯ν•΄μ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€.

@Enumerated(EnumType.STRING)
private RoleType roleType;

μœ„μ™€ 같이 EnumType.STRING으둜 μ„€μ •ν•˜κ³  μ•„κΉŒ 였λ₯˜κ°€ λ°œμƒν–ˆλ˜ μ‹œλ‚˜λ¦¬μ˜€λ₯Ό λ˜‘κ°™μ΄ λ‹€μ‹œ μˆ˜ν–‰ν•΄λ³Όκ»˜μš”.

λ‚΄λΆ€μ μœΌλ‘œ EnumType의 μˆœμ„œλŠ” λ°”λ€Œμ—ˆμ§€λ§Œ 문제 μ—†μŠ΅λ‹ˆλ‹€. μˆœμ„œ 값인 μƒμˆ˜λ₯Ό μ΄μš©ν•˜μ§€ μ•Šκ³  STRING을 μ΄μš©ν–ˆμœΌλ‹ˆκΉŒμš”.

πŸ“Œ EnumType.STRING ꢌμž₯.. !

@Enumerated(EnumType.STRING)

κ°μ‚¬ν•©λ‹ˆλ‹€. πŸ˜„

profile
μ’€ 더 천천히 까먹기 μœ„ν•΄ κΈ°λ‘ν•©λ‹ˆλ‹€. 🧐

0개의 λŒ“κΈ€