DB์ Enum
์ ์ ์ฅํ ๋, EnumType.ORDINAL
๊ณผ EnumType.STRING
์ค ์ด๋ค ๋ฐฉ์์ ์ ํํ๋ ๊ฒ ์ต์ ์ผ๊น?
์ด๊ฑธ ๊ณ ๋ฏผํ๋ค๊ฐ ์์ธ๋ถํฐ ์คํ, ํด๊ฒฐ์ฑ ๊น์ง ์ ๋ฆฌํด๋ดค๋ค.
JPA์์ Enum
์ DB์ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ ํฌ๊ฒ ๋ ๊ฐ์ง๋ค.
@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 ๊ฐ์ด ๋ฐ๋์ง ์๋ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํด์ผ ํ๋ค!"
@Enumerated(EnumType.STRING)
private MemberStatus status;
๐ ์์
ID | Name | Status |
---|---|---|
1 | Alice | ACTIVE |
2 | Bob | BANNED |
โ๏ธ ์ฅ์
โ
๊ฐ๋
์ฑ์ด ์ข์ (DB์์ ๊ฐ๋ง ๋ด๋ ์๋ฏธ๋ฅผ ์ดํดํ ์ ์์)
โ
์์ ๋ณ๊ฒฝ๊ณผ ์๊ด์์ด ์์ ํจ
โ ๋จ์
๐จ ์ซ์๋ณด๋ค ์ ์ฅ ๊ณต๊ฐ์ ๋ ์ฐจ์งํจ (VARCHAR ํ์
)
๐จ ๋๋ ๋ฐ์ดํฐ์์ ์กฐํ ์ฑ๋ฅ์ด ๋ค์ ๋จ์ด์ง ์ ์์
๋ฐ์ดํฐ 5000๊ฐ ๊ธฐ์ค์ผ๋ก ์ฑ๋ฅ ํ ์คํธ๋ฅผ ์งํํด๋ณด์.
์ ์ฅ ๋ฐฉ์ | ์กฐํ ์๋ (5000๊ฐ) |
---|---|
EnumType.ORDINAL (์ซ์) | 0.5~1ms |
EnumType.STRING (๋ฌธ์์ด) | 1~2ms |
์ ์ฅ ๋ฐฉ์ | 5000๊ฐ ๊ธฐ์ค DB ํฌ๊ธฐ |
---|---|
EnumType.ORDINAL (์ซ์) | ์ฝ 20KB |
EnumType.STRING (๋ฌธ์์ด) | ์ฝ 40~50KB |
๐ก ์๊ท๋ชจ ๋ฐ์ดํฐ์์๋ ์ฑ๋ฅ ์ฐจ์ด๊ฐ ํฌ์ง ์์ง๋ง, ๋๋์ ๋ฐ์ดํฐ์์๋ ORDINAL ๋ฐฉ์์ด ์ ๋ฆฌํ ์ ์์.
ํ์ง๋ง ENUM์ด ๋ณ๊ฒฝ๋ ๊ฐ๋ฅ์ฑ์ด ์๋ค๋ฉด STRING ๋ฐฉ์์ด ์ ์ง๋ณด์ ์ธก๋ฉด์์ ๋ ์์ ํจ.
ORDINAL ๋ฐฉ์์ด ์ํํ ์ด์ ๋ ์์๊ฐ ๋ฐ๋ ๊ฐ๋ฅ์ฑ ๋๋ฌธ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ์์๋ฅผ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ์ด ์๋ค๋ฉด ORDINAL์ ์จ๋ ๊ด์ฐฎ์๊น?
@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)
๋ก ๊ณ ์ ๋๊ธฐ ๋๋ฌธ์ ์์๊ฐ ๋ฐ๋์ด๋ ์์ ํจ! ๐ ํ์ง๋ง, ์ฌ์ ํ DB ์กฐํ ๊ฐ๋
์ฑ์ด ๋จ์ด์ง ์ ์์.
์ด๋ด ๋ Enum์ ๋ฐ๋ก ํ
์ด๋ธ๋ก ๋ง๋ค์ด์ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ๋ ์๋ค.
JPA์์ Enum
์ ํ
์ด๋ธ๋ก ์ ์ฅํ๋ฉด ์กฐํ ์ฑ๋ฅ์ ์ ์งํ๋ฉด์ ๊ฐ๋
์ฑ๋ ํ๋ณด ๊ฐ๋ฅํ๋ค.
@Entity
@Table(name = "member_status")
public class MemberStatusEntity {
@Id
private Integer code;
@Column(nullable = false, unique = true)
private String name;
}
์ด๋ ๊ฒ ํ๋ฉด Enum์ ๋ณ๊ฒฝํ ๋๋ ์์ ์ ์ผ๋ก ๊ด๋ฆฌ ๊ฐ๋ฅํ๋ค.
ํ์ง๋ง, ์กฐ์ธ ์ฟผ๋ฆฌ๊ฐ ์ถ๊ฐ๋๋ฏ๋ก ์๋น์ค ๊ท๋ชจ์ ๋ฐ๋ผ ์ ํํด์ผ ํ๋ค.
์ํฉ | ์ถ์ฒ Enum ์ ์ฅ ๋ฐฉ์ |
---|---|
์ฑ๋ฅ์ด ๊ฐ์ฅ ์ค์ํจ | ORDINAL (์ซ์ ์ ์ฅ) |
์ ์ง๋ณด์์ ๊ฐ๋ ์ฑ์ด ์ค์ํจ | STRING (๋ฌธ์์ด ์ ์ฅ) |
์์ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ด ์์ | STRING or ๋ณ๋ ํ ์ด๋ธ ๊ด๋ฆฌ |
Enum ๊ฐ์ด ๋ง๊ณ ์์ฃผ ๋ฐ๋ | ๋ณ๋ ํ ์ด๋ธ๋ก ๊ด๋ฆฌ |
๐ ์ค์ ์๋น์ค๋ผ๋ฉด?
EnumType.STRING
์ด ์ ์ง๋ณด์ํ๊ธฐ ์ข์ "์ฑ๋ฅ์ด ์ค์ํ ์๋น์ค๋ ORDINAL, ์ ์ง๋ณด์๊ฐ ์ค์ํ ์๋น์ค๋ STRING์ ์ ํํ์"