JPA Enum ๋งคํ ์ ๋ต ์ต์ ํ๋ฅผ ํตํ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ๋ณด์ฅ ๋ฐ ๋ฐํ์ ์ค๋ฅ ๋ฐฉ์ง
๐๏ธ The JPA Enum Default Quietly Corrupts Your Data
AI ์์ฝ
Context
JPA ๊ธฐ๋ณธ ์ค์ ์ธ EnumType.ORDINAL ์ฌ์ฉ ์ Enum ์์ ๋ณ๊ฒฝ์ผ๋ก ์ธํ ๋ฐ์ดํฐ ์ค์ผ ๋ฐ์ ์ํ ์์กด. DB ๋ ๋ฒจ์ ์ ์ฝ ์กฐ๊ฑด ๋ถ์ฌ๋ก ์ธํด ์๋ชป๋ ๊ฐ์ด ์ ์ฅ๋์ด๋ ๋ฐํ์ ์์ ๊น์ง ์ธ์งํ์ง ๋ชปํ๋ ๊ตฌ์กฐ์ ํ๊ณ ์กด์ฌ.
Technical Solution
- @Enumerated(STRING) ๋์ ์ ํตํ ์์๋ช ์ ์ฅ ๋ฐฉ์์ผ๋ก ์์ ๋ณ๊ฒฝ์ ๋ฐ๋ฅธ ๋ฐ์ดํฐ ๋งคํ ์ค๋ฅ ์์ฒ ์ฐจ๋จ
- Postgres Native Enum Type ์ ์ฉ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ธ๋ถ์ ๋ฐ์ดํฐ ์ ํจ์ฑ ๊ฒ์ฆ ๊ณ์ธต ์ถ๊ฐ
- JDBC connection URL์ stringtype=unspecified ์ต์ ์ ์ค์ ํ์ฌ varchar์ enum ํ์ ๊ฐ์ Implicit Cast ๋ฌธ์ ํด๊ฒฐ
- AttributeConverter๋ฅผ ๊ตฌํํ์ฌ Java ์๋ณ์์ DB ์ ์ฅ ๊ฐ(Stable Code)์ ๋ถ๋ฆฌํจ์ผ๋ก์จ ์์๋ช ๋ณ๊ฒฝ ์์ Migration ๋น์ฉ ์ ๊ฑฐ
- Lookup Table ๊ตฌ์กฐ๋ ๋ฐํ์์ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๋น์ฆ๋์ค ์์ฑ(SLA, Label ๋ฑ)์ด ํฌํจ๋ ๊ฒฝ์ฐ๋ก ํ์ ํ์ฌ Join ์ค๋ฒํค๋ ์ต์ํ
์ค์ฒ ํฌ์ธํธ
- ๋จ์ ์ํ ๊ฐ ์ ์ฅ ์ @Enumerated(STRING)๊ณผ DB Native Enum ์กฐํฉ์ ๊ธฐ๋ณธ์ผ๋ก ๊ฒํ - Enum ์์ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ด ์๋ ๋ ๊ฑฐ์ ์์คํ ์ ordinal ๊ฒ์ฆ ํ ์คํธ ์ฝ๋๋ฅผ ํตํด ๋น๋ ์์ ์ Guardrail ๊ตฌ์ถ - ๋๋ฉ์ธ ์ฉ์ด ๋ณ๊ฒฝ์ด ๋น๋ฒํ ์ด๊ธฐ ๋จ๊ณ ํ๋ก์ ํธ๋ AttributeConverter๋ฅผ ํตํ ์ฝ๋ ๊ธฐ๋ฐ ๋งคํ ์ ์ฉ - ๋จ์ ์ํ ๊ฐ์ Join์ ์ ๋ฐํ๋ Lookup Table์ ๋จ์ฉํ๊ณ ์์ง ์์์ง ๊ฒํ