๐ 0. ์๋ก
๊ฐ๋ฐ์ ํ๋ค๋ณด๋ฉด, ๋ฐฑ์๋์์๋ ์์ธํ ์ ๋ณด๋ฅผ ๋ชจ๋ ๋ด๊ณ ์๋ ๊ฐ์ฒด๋ฅผ, ๋ฐ์ดํฐ๋ฒ ์ด์ค์์๋ ํต์ฌ์ ์ผ๋ก ๋ถ๋ณ๊ฐ๋ฅํ ํํธ๋ง ์ ์ฅํ๊ณ ์ถ์ ๋๊ฐ ์์ต๋๋ค.
ํ์ง๋ง ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฃ์ ์ ์๋ ํ์ ์ ์ ํด์ ธ์์ต๋๋ค. ๋ฐ๋ผ์ ์ํฐํฐ์ ํ๋๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ธ์ํ์ง ๋ชปํ๋ ๊ฐ์ฒด๋ฅผ ์ฝ์ ํ๋ฉด ์ปดํ์ผ ์๋ฌ๋ฅผ ๋ง์ฃผํ ์ ์์ต๋๋ค.
์ค๋์ ์ด๋ฌํ ๊ฐ๊ทน์ ํด๊ฒฐํด์ค ๋ ๊ฐ์ง ๊ธฐ์ ์ ๋ํด์ ์ ๋ฆฌํ๋ ค๊ณ ํฉ๋๋ค.
๋ฐฑ์๋์์๋ Enum ๊ฐ์ฒด๋ก, DB์์๋ Enum์ ์์๊ฐ(์์๊ฐ)์ด๋ ์ด๋ฆ์ผ๋ก ์ ์ฅํ ์ ์๋๋ก ๋ณํํด์ฃผ๋ @Enumerated์,
Enum ๊ฐ์ฒด ๋ฟ๋ง ์๋๋ผ JPA๊ฐ ์ง์ํ์ง ์๋ ํ์ ์ ๋ณํ๊ฐ๋ฅํ๋ฉฐ, ์ฌ์ง์ด ๋ ๊ฐ ์ด์์ ์์ฑ์ ๊ฐ๋ ๊ฐ์ฒด๋ฅผ ํ ๊ฐ ํ๋์ ๋งคํ์ํฌ ์ ์๋ AttributeConverter์ ๋ํด ์ ๋ฆฌํฉ๋๋ค.
๐ช 1. @Enumerated
@Enumerated๋ ์ํฐํฐ ๊ฐ์ฒด์์๋ Enum ๊ฐ์ฒด๋ฅผ ํ๋๊ฐ์ผ๋ก ๊ฐ์ง ์ ์๋๋ก ํ๊ณ , DB์๋ Enum์ ์์๊ฐ(์์๊ฐ)์ด๋ ์ด๋ฆ์ผ๋ก ์ ์ฅํ ์ ์๋๋ก ๋ณํ์ ์ง์ํด์ฃผ๋ ์ด๋ ธํ ์ด์
enum Gender{
male,
female;
}
... ์ํฐํฐ ๋๋จธ์ง ์๋ต
private Gender gender; // JPA์์ ์ธ์ํ ์ ์๋ ํ์
! ์ค๋ฅ!
์ฑ๋ณ์ Enum ๊ฐ์ฒด๋ก ํํํ๊ณ , @Entity ์ด๋ ธํ ์ด์ ์ด ๋ถ์ ์ํฐํฐ ๊ฐ์ฒด์ ํ๋๋ก ํด๋น Enum ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ ์ํฉ์ ๋๋ค.
Gender Enum์ ํ์ฅํด์ ๋์ฑ ๋ค์ํ ์ ๋ณด๋ฅผ ๋ด๋๋ค๋ฉด, ์ํฐํฐ ๊ฐ์ฒด ๋ด์ ํ๋์ ์ ๊ทผ๋ง์ผ๋ก ๋ค์ํ ํ์ฉ์ด ๊ฐ๋ฅํ ๊ฒ์ ๋๋ค.
ํ์ง๋ง JPA๋ Gender๋ผ๋ Enum ๊ฐ์ฒด๋ ์ง์ํ์ง ์๋ ํ์ ์ด๊ธฐ ๋๋ฌธ์, ํน์ํ ์ฒ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค.
@Enumerated(EnumType.STRING)
private Gender gender;
์ด๋ ๊ฒ @Enumerated ์ด๋ ธํ ์ด์ ์ ํ์ฉํ๋ฉด, DB์ ๋ฐ์๋ ๋๋ Gender ๊ฐ์ฒด๊ฐ ์ฝ์ ๋๋ ๊ฒ์ด ์๋, EnumType์ "์ด๋ฆ"์ ์ ์ฅํ๊ฒ ๋ฉ๋๋ค.
์์์ ์ค๋ช ํ๋ฏ์ด, @Enumerated๋ Enum์ ์์๊ฐ ํน์ ์ด๋ฆ์ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ์ง์ํ๋ EnumType ๋ ๊ฐ์ง๊ฐ ์์ต๋๋ค.
EnumType.STRING : Enum์ "์ด๋ฆ"์ ์ ์ฅ (์์ ์์๋ 'male', 'female')
EnumType.ORDINAL : Enum์ "์์๊ฐ"์ ์ ์ฅ (์์ ์์๋ 1, 2)
ํ์ง๋ง @Enumerated์ ๋จ์ ์ด ์์ต๋๋ค.
1) Enum ํ์ ๋ด๋ถ์ ์์ ํน์ ์ด๋ฆ์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ
๋ง์ฝ ์ฑ๋ณ์ ์ ๋ ฅํ์ง ์์ ๊ฒฝ์ฐ๋ ๋ฐ์ง๊ธฐ ์ํด์ enum Gender{none, male, female}๋ก ๋ณ๊ฒฝํ๋ค๊ณ ๊ฐ์ ํด๋ด ์๋ค. EnumType.ORDINAL๋ก ์ค์ ํ ๊ฒฝ์ฐ์๋, ๊ธฐ์กด์ 1์ ๊ฐ์ ํํํ๋ male์ด 2๋ก ๋ณ๊ฒฝ๋์์ผ๋ฏ๋ก ์์ผ๋ก DB์๋ 2๋ก ์ ์ฅ๋ ๊ฒ์ ๋๋ค. ๋ ๊ธฐ์กด์ female์ด์๊ธฐ ๋๋ฌธ์ 2๋ก ์ ์ฅ๋์ด ์๋ ๊ฐ๋ค์ด male๋ก ํํ๋์ด ๋์ค๊ฒ ๋ฉ๋๋ค. ์ด๋ฆ์ด ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ์๋ ์ด์ ๊ฐ์ ํผ์ ์ ๋น์ ์ ์๊ธฐ ๋๋ฌธ์ ์ํํฉ๋๋ค.
2) EnumType์ ์ข ๋ฅ๊ฐ 2๊ฐ์ด๋ค.
Java์ Enum์ class์ด๊ธฐ ๋๋ฌธ์ ๋ง์ ํ๋ ๊ฐ์ ๊ฐ์ง ์ ์์ต๋๋ค. ์์๊ฐ ํํ๊ณผ ์ด๋ฆ์ ์ ํ์ด ๊ฐ๋ฅํ์ง๋ง, ๋ค๋ฅธ ํ๋๋ก๋ ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค. ์ด๋ฆ์ ์ ์ฅํ๋ ๊ฒ๋, ๊ตฌ๋ถ๊ฐ๋ฅํ ์ต์ ์ฌ์ด์ฆ์ String์ผ๋ก ์ถ์ฝํ์ง ๋ชปํ๊ณ ์ด๋ฆ ๊ทธ๋๋ก DB์ ํํํ๊ธฐ ๋๋ฌธ์ ๊ณต๊ฐ์ ์ฐจ์งํ๋ ๊ฒ๋ ๋จ์ ์ ๋๋ค.
๐ช 2. AttributeConverter
์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๊ฐ์ฅ ์ ํฉํ ๋ฐฉ๋ฒ์, JPA์์ ์ ๊ณตํ๋ AttributeConverter๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ ๋๋ค.
์ธํฐํ์ด์ค์ ํ์์ผ๋ก ์ ๊ณต๋๋ฉฐ, ์ด๊ฒ์ implementsํด convertํ๋ ๋ก์ง์ ์์ฑ์ํค๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
public Y convertToDatabaseColumn (X attribute) :
์ํฐํฐ ๊ฐ์ฒด์ Attribute๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปฌ๋ผ์ผ๋ก ๋ณํ์ํค๋ ๋ฉ์๋์ ๋๋ค.
public X convertToEntityAttribute (Y dbData) :
DB์ ์ปฌ๋ผ์ ์ ์ฅ๋ ๊ฐ์ ์ํฐํฐ ๊ฐ์ฒด๊ฐ ๊ฐ์ง Attribute ๊ฐ์ผ๋ก ๋ณํ์ํค๋ ๋ฉ์๋์ ๋๋ค.
@Converter
public class GenderConverter implements AttributeConverter<Gender, String>{
@Override
public String convertToDatabaseColumn(Gender attribute){
return attribute.name();
}
@Override
public Gender convertToEntityAttribute(String dbData){
return Gender.valueOf(dbData);
}
}
1) AttributeConverter๋ฅผ implements ํ๊ธฐ
2) @Converter ์ด๋ ธํ ์ด์ ๋ช ์
3) ์ฌ์ ์ ํด์ผ ํ๋ ๋ ๋ฉ์๋ ๋ก์ง ์ฑ์ฐ๊ธฐ
.. ์ํฐํฐ ๋๋จธ์ง ์๋ต
@Convert(converter = GenderConverter.class)
private Gender gender;
4) @Convert ์ด๋ ธํ ์ด์ ์ ํตํด ์ปจ๋ฒํฐ ํด๋์ค ์ง์ .
AttributeConverter๋ฅผ ํ์ฉํ๋ฉด, ๊ผญ ์์๊ฐ ํน์ ์ด๋ฆ์ด ์๋๋๋ผ๋ ๋ก์ง์ ์ง์ ๊ตฌํํ๋ ๊ฒ์ผ๋ก ๋ค์ํ ๋ณํ์ด ๊ฐ๋ฅํฉ๋๋ค.
Enum์ ์ด๋ฆ ๊ทธ๋๋ก๊ฐ ์๋ ์ถ์ฝ์ ๊ฑฐ์ณ ๋ณํ๋ ๊ฐ๋ฅํ๊ณ , Enum ๊ฐ์ฒด๊ฐ ์๋๋๋ผ๋ JPA์์ ์ง์ํ์ง ์๋ ํ์ ์ ์ํฐํฐ์ Attribute๋ก ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด ์ด๋ฅผ ํตํด์ ๊ตฌํ์ด ๊ฐ๋ฅํฉ๋๋ค.
๋ก์ง์ ๊ตฌํํ ์ ์๋ค๋ ์ฅ์ ์์, ๋ ๊ฐ ์ด์์ ์์ฑ์ ๊ฐ๋ ๊ฐ์ฒด๋ ํ ํ๋์ ๋งคํ์ํฌ ์ ์์ต๋๋ค.
๋ ๊ฐ ์ด์์ ์์ฑ์ ๊ฐ๋ ๊ฐ์ฒด๋ฅผ ToString ์ค๋ฒ๋ผ์ด๋ฉํ ํ์, DB์ ์ฝ์ ํ ์ ์๊ณ
DB์์ ๊บผ๋ด ์ฌ ๋๋ ํ์ฑ ๋ก์ง์ ๊ตฌํํด์ ๋ค์ ๊ฐ์ฒด๋ฅผ ์์ฑํด converting ํ ์ ์์ต๋๋ค.
์ด์ ๊ฐ์ด ์ ์ฐํ๊ณ ํ์ฅ์ฑ์ด ์ข์ AttributeConverter๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด @Enumerated๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
AttributeConverter์ ๋จ์ ์ผ๋ก๋ ํด๋์ค์ ์ถ๊ฐ์ ์ธ ๊ตฌํ์ด ์๋ค๋ ๊ฒ ์ธ์๋ ๋ณ๋ก ์ฐพ์๋ณด๊ธฐ ์ด๋ ค์ด ๊ฒ ๊ฐ์ต๋๋ค.