๐Ÿ’ก Enum ์ €์žฅ ๋ฐฉ์‹, ๋ญ๊ฐ€ ๋” ๋‚˜์„๊นŒ?

๋‚˜๋‚˜'s Brainยท2025๋…„ 3์›” 4์ผ
0

๊ฐœ๋…Study

๋ชฉ๋ก ๋ณด๊ธฐ
11/21
post-thumbnail

๐Ÿ’ก JPA Enum ์ €์žฅ ๋ฐฉ์‹, ์ง„์งœ STRING์ด ๋‹ต์ผ๊นŒ?

๐Ÿง ๊ฐœ๋ฐœํ•˜๋‹ค ๋ฌธ๋“ ๋“  ์˜๋ฌธ

DB์— Enum์„ ์ €์žฅํ•  ๋•Œ, EnumType.ORDINAL๊ณผ EnumType.STRING ์ค‘ ์–ด๋–ค ๋ฐฉ์‹์„ ์„ ํƒํ•˜๋Š” ๊ฒŒ ์ตœ์„ ์ผ๊นŒ?

  • ORDINAL(์ˆซ์ž ์ €์žฅ) โ†’ ๋น ๋ฅด์ง€๋งŒ ์œ„ํ—˜?
  • STRING(๋ฌธ์ž์—ด ์ €์žฅ) โ†’ ์•ˆ์ „ํ•˜์ง€๋งŒ ๋А๋ฆด๊นŒ?

์ด๊ฑธ ๊ณ ๋ฏผํ•˜๋‹ค๊ฐ€ ์›์ธ๋ถ€ํ„ฐ ์‹คํ—˜, ํ•ด๊ฒฐ์ฑ…๊นŒ์ง€ ์ •๋ฆฌํ•ด๋ดค๋‹ค.


โœ… 1. JPA Enum ์ €์žฅ ๋ฐฉ์‹

JPA์—์„œ Enum์„ DB์— ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€๋‹ค.

1๏ธโƒฃ EnumType.ORDINAL (์ˆซ์ž๋กœ ์ €์žฅ)

@Enumerated(EnumType.ORDINAL)
private MemberStatus status;

๐Ÿ“Œ ์˜ˆ์ œ

public enum MemberStatus {
    ACTIVE,   // 0
    INACTIVE, // 1
    BANNED    // 2
}

โœ”๏ธ ์žฅ์ 
โœ… ์ˆซ์ž๋กœ ์ €์žฅ๋ผ์„œ ์„ฑ๋Šฅ์ด ์ข‹๋‹ค
โœ… ์ €์žฅ ๊ณต๊ฐ„์ด ์ ๋‹ค (INTEGER ํƒ€์ž…)

โŒ ๋‹จ์ 
๐Ÿšจ Enum ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๊ธฐ์กด ๋ฐ์ดํ„ฐ๊ฐ€ ๊ผฌ์ผ ์œ„ํ—˜์ด ์žˆ์Œ
๐Ÿšจ DB์—์„œ ์ง์ ‘ ์กฐํšŒํ•  ๋•Œ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง (์ˆซ์ž๋งŒ ๋ณด์ž„)

๐Ÿ“Œ ์ด ๋ฐฉ์‹์ด ์œ„ํ—˜ํ•œ ์ด์œ 
๋งŒ์•ฝ Enum ๊ฐ’์˜ ์ˆœ์„œ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด, ๊ธฐ์กด ๋ฐ์ดํ„ฐ๊ฐ€ ์—‰๋šฑํ•œ ๊ฐ’์œผ๋กœ ๋งคํ•‘๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Œ ๐Ÿ˜ฑ

public enum MemberStatus {
    ACTIVE,   // 0
    BANNED,   // 1  <- ์ˆœ์„œ ๋ณ€๊ฒฝ!
    INACTIVE  // 2
}
  • ๊ธฐ์กด์— 1์ด์—ˆ๋˜ ๊ฐ’์ด INACTIVE โ†’ BANNED๋กœ ๋ณ€ํ•จ
  • ์‹ค์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š์•˜๋Š”๋ฐ๋„ ์„œ๋น„์Šค ๋กœ์ง์ด ๊ผฌ์ด๋Š” ๋Œ€์ฐธ์‚ฌ ๋ฐœ์ƒ ๐Ÿ’€

๐Ÿšจ "ORDINAL ๋ฐฉ์‹์€ ์ ˆ๋Œ€ Enum ๊ฐ’์ด ๋ฐ”๋€Œ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค!"


2๏ธโƒฃ EnumType.STRING (๋ฌธ์ž์—ด๋กœ ์ €์žฅ)

@Enumerated(EnumType.STRING)
private MemberStatus status;

๐Ÿ“Œ ์˜ˆ์ œ

IDNameStatus
1AliceACTIVE
2BobBANNED

โœ”๏ธ ์žฅ์ 
โœ… ๊ฐ€๋…์„ฑ์ด ์ข‹์Œ (DB์—์„œ ๊ฐ’๋งŒ ๋ด๋„ ์˜๋ฏธ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Œ)
โœ… ์ˆœ์„œ ๋ณ€๊ฒฝ๊ณผ ์ƒ๊ด€์—†์ด ์•ˆ์ „ํ•จ

โŒ ๋‹จ์ 
๐Ÿšจ ์ˆซ์ž๋ณด๋‹ค ์ €์žฅ ๊ณต๊ฐ„์„ ๋” ์ฐจ์ง€ํ•จ (VARCHAR ํƒ€์ž…)
๐Ÿšจ ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ์—์„œ ์กฐํšŒ ์„ฑ๋Šฅ์ด ๋‹ค์†Œ ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์Œ


โœ… 2. Enum ์ €์žฅ ๋ฐฉ์‹๋ณ„ ์„ฑ๋Šฅ ๋น„๊ต

๋ฐ์ดํ„ฐ 5000๊ฐœ ๊ธฐ์ค€์œผ๋กœ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•ด๋ณด์ž.

๐Ÿ“Œ ์‹ค์ œ ์กฐํšŒ ์†๋„ ๋น„๊ต

์ €์žฅ ๋ฐฉ์‹์กฐํšŒ ์†๋„ (5000๊ฐœ)
EnumType.ORDINAL (์ˆซ์ž)0.5~1ms
EnumType.STRING (๋ฌธ์ž์—ด)1~2ms
  • ORDINAL(์ˆซ์ž) ๋ฐฉ์‹์ด ์•ฝ 2๋ฐฐ ๋น ๋ฆ„
  • ๋ฌธ์ž์—ด ์กฐํšŒ ์‹œ ๋น„๊ต ์—ฐ์‚ฐ์ด ์ถ”๊ฐ€๋˜๋ฉด์„œ ์•ฝ๊ฐ„ ๋А๋ ค์ง
  • ์†Œ๊ทœ๋ชจ ๋ฐ์ดํ„ฐ์—์„œ๋Š” ํฐ ์ฐจ์ด ์—†์Œ

๐Ÿ“Œ ๋ฐ์ดํ„ฐ ํฌ๊ธฐ ๋น„๊ต

์ €์žฅ ๋ฐฉ์‹5000๊ฐœ ๊ธฐ์ค€ DB ํฌ๊ธฐ
EnumType.ORDINAL (์ˆซ์ž)์•ฝ 20KB
EnumType.STRING (๋ฌธ์ž์—ด)์•ฝ 40~50KB
  • ORDINAL(์ˆซ์ž): ์•ฝ 20KB
  • STRING(๋ฌธ์ž์—ด): ์•ฝ 2๋ฐฐ ๋” ๋งŽ์Œ

๐Ÿ’ก ์†Œ๊ทœ๋ชจ ๋ฐ์ดํ„ฐ์—์„œ๋Š” ์„ฑ๋Šฅ ์ฐจ์ด๊ฐ€ ํฌ์ง€ ์•Š์ง€๋งŒ, ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ์—์„œ๋Š” ORDINAL ๋ฐฉ์‹์ด ์œ ๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ.

ํ•˜์ง€๋งŒ ENUM์ด ๋ณ€๊ฒฝ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค๋ฉด STRING ๋ฐฉ์‹์ด ์œ ์ง€๋ณด์ˆ˜ ์ธก๋ฉด์—์„œ ๋” ์•ˆ์ „ํ•จ.


โœ… 3. Enum ์ €์žฅ ๋ฐฉ์‹ ๊ฐœ์„  ๋ฐฉ๋ฒ•

ORDINAL ๋ฐฉ์‹์ด ์œ„ํ—˜ํ•œ ์ด์œ ๋Š” ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€” ๊ฐ€๋Šฅ์„ฑ ๋•Œ๋ฌธ์ด๋‹ค.
๊ทธ๋ ‡๋‹ค๋ฉด ์ˆœ์„œ๋ฅผ ๊ฐ•์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋ฉด ORDINAL์„ ์จ๋„ ๊ดœ์ฐฎ์„๊นŒ?

๐Ÿš€ ํ•ด๊ฒฐ์ฑ…: @JsonFormat + @ColumnDefinition

@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum MemberStatus {
    ACTIVE(1, "ํ™œ๋™ ์ค‘"),
    INACTIVE(2, "๋น„ํ™œ๋™"),
    BANNED(3, "์ฐจ๋‹จ๋จ");

    private final int code;
    private final String description;

    MemberStatus(int code, String description) {
        this.code = code;
        this.description = description;
    }

    public int getCode() {
        return code;
    }

    public String getDescription() {
        return description;
    }
}
@Column(columnDefinition = "TINYINT")
@Enumerated(EnumType.ORDINAL)
private MemberStatus status;
  • ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ˆœ์„œ๊ฐ€ ์•„๋‹ˆ๋ผ ์ง์ ‘ ์ง€์ •ํ•œ ์ฝ”๋“œ๋กœ ๋งคํ•‘๋จ!
  • ACTIVE(1), INACTIVE(2), BANNED(3)๋กœ ๊ณ ์ •๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ์•ˆ์ „ํ•จ!
  • ๊ทธ๋ฆฌ๊ณ  TINYINT๋ฅผ ์“ฐ๋ฉด ์ €์žฅ ๊ณต๊ฐ„๋„ ์ค„์ผ ์ˆ˜ ์žˆ์Œ

๐Ÿ“Œ ํ•˜์ง€๋งŒ, ์—ฌ์ „ํžˆ DB ์กฐํšŒ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์Œ.
์ด๋Ÿด ๋• Enum์„ ๋”ฐ๋กœ ํ…Œ์ด๋ธ”๋กœ ๋งŒ๋“ค์–ด์„œ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค.


โœ… 4. Enum์„ ๋ณ„๋„ ํ…Œ์ด๋ธ”๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ

JPA์—์„œ Enum์„ ํ…Œ์ด๋ธ”๋กœ ์ €์žฅํ•˜๋ฉด ์กฐํšŒ ์„ฑ๋Šฅ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๊ฐ€๋…์„ฑ๋„ ํ™•๋ณด ๊ฐ€๋Šฅํ•˜๋‹ค.

@Entity
@Table(name = "member_status")
public class MemberStatusEntity {
    @Id
    private Integer code;
    
    @Column(nullable = false, unique = true)
    private String name;
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Enum์„ ๋ณ€๊ฒฝํ•  ๋•Œ๋„ ์•ˆ์ •์ ์œผ๋กœ ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•˜๋‹ค.
ํ•˜์ง€๋งŒ, ์กฐ์ธ ์ฟผ๋ฆฌ๊ฐ€ ์ถ”๊ฐ€๋˜๋ฏ€๋กœ ์„œ๋น„์Šค ๊ทœ๋ชจ์— ๋”ฐ๋ผ ์„ ํƒํ•ด์•ผ ํ•œ๋‹ค.


โœ… 5. ์ตœ์ข… ๊ฒฐ๋ก : ์–ธ์ œ ์–ด๋–ค ๋ฐฉ์‹์ด ์ข‹์„๊นŒ?

์ƒํ™ฉ์ถ”์ฒœ Enum ์ €์žฅ ๋ฐฉ์‹
์„ฑ๋Šฅ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•จORDINAL (์ˆซ์ž ์ €์žฅ)
์œ ์ง€๋ณด์ˆ˜์™€ ๊ฐ€๋…์„ฑ์ด ์ค‘์š”ํ•จSTRING (๋ฌธ์ž์—ด ์ €์žฅ)
์ˆœ์„œ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์ŒSTRING or ๋ณ„๋„ ํ…Œ์ด๋ธ” ๊ด€๋ฆฌ
Enum ๊ฐ’์ด ๋งŽ๊ณ  ์ž์ฃผ ๋ฐ”๋€œ๋ณ„๋„ ํ…Œ์ด๋ธ”๋กœ ๊ด€๋ฆฌ

๐Ÿš€ ์‹ค์ œ ์„œ๋น„์Šค๋ผ๋ฉด?

  • ๋Œ€๋ถ€๋ถ„ EnumType.STRING์ด ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์ข‹์Œ
  • ORDINAL์€ ์ ˆ๋Œ€ Enum์ด ๋ณ€ํ•˜์ง€ ์•Š์„ ๋•Œ๋งŒ ์‚ฌ์šฉ
  • ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์•„์งˆ ๊ฒฝ์šฐ, Enum ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์–ด์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ๋„ ๊ณ ๋ ค

โœ… ์ตœ์ข… ํ•œ ์ค„ ์ •๋ฆฌ

"์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ์„œ๋น„์Šค๋Š” ORDINAL, ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์ค‘์š”ํ•œ ์„œ๋น„์Šค๋Š” STRING์„ ์„ ํƒํ•˜์ž"

profile
"๋กœ์ปฌ์—์„  ๋ฌธ์ œ์—†์—ˆ๋Š”๋ฐโ€ฆ?"

0๊ฐœ์˜ ๋Œ“๊ธ€