๊ฐœ๋ฐœ์ž HOON
๐Ÿ› HOON DEVLog
๊ฐœ๋ฐœ์ž HOON
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๐Ÿ˜Ž ์ „์ฒด ์นดํ…Œ๊ณ ๋ฆฌ (137)
    • ๐Ÿ“ ์‹ ์ž… ์ธํ„ฐ๋ทฐ ์ค€๋น„ (7)
    • ๐Ÿฆ” ์ทจ์—…์ค€๋น„ ๊ธฐ๋ก (7)
    • โ˜• ์ž๋ฐ” : JAVA (5)
    • ๐Ÿ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๋Œ€๋น„ : PS (80)
    • ๐ŸŒฑ ๋ฐฑ์—”๋“œ : Backend (13)
    • ๐Ÿงช ์ปดํ“จํ„ฐ๊ณผํ•™ : CS (11)
    • ๐Ÿ—‚ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค : DB (1)
    • ๐Ÿƒ‍โ™‚๏ธ DEVLOG (8)
    • โš™๏ธ Trouble Shooting (5)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • GitHub
  • Resume

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
๊ฐœ๋ฐœ์ž HOON

๐Ÿ› HOON DEVLog

[Spring JPA] @Enumerated์™€ AttributeConverter
๐ŸŒฑ ๋ฐฑ์—”๋“œ : Backend

[Spring JPA] @Enumerated์™€ AttributeConverter

2022. 12. 27. 00:26

 

๐Ÿ 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์˜ ๋‹จ์ ์œผ๋กœ๋Š” ํด๋ž˜์Šค์˜ ์ถ”๊ฐ€์ ์ธ ๊ตฌํ˜„์ด ์žˆ๋‹ค๋Š” ๊ฒƒ ์™ธ์—๋Š” ๋ณ„๋กœ ์ฐพ์•„๋ณด๊ธฐ ์–ด๋ ค์šด ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

 

์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋™์ผ์กฐ๊ฑด (์ƒˆ์ฐฝ์—ด๋ฆผ)

'๐ŸŒฑ ๋ฐฑ์—”๋“œ : Backend' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Spring] @ControllerAdvice์™€ @ExceptionHandler  (0) 2023.03.18
[Spring WebFlux] 1. Mono์™€ Flux์— ๋Œ€ํ•œ ์ดํ•ด(2) : ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” operator (method)  (0) 2023.01.06
[Spring WebFlux] 1. Mono์™€ Flux์— ๋Œ€ํ•œ ์ดํ•ด(1) : ์ž‘๋™ ๋ฐฉ์‹๊ณผ ์ดํ•ด  (0) 2023.01.06
[Spring WebFlux] 0. ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์†Œ๊ฐœ  (1) 2023.01.01
[Spring] ์Šคํ”„๋ง์˜ ํ•ต์‹ฌ ๊ฐœ๋…, DI / IoC๋ž€ ๋ฌด์—‡์ธ๊ฐ€? (์˜์กด์„ฑ ์ฃผ์ž…, ์ œ์–ด์˜ ์—ญ์ „)  (0) 2022.10.10
    '๐ŸŒฑ ๋ฐฑ์—”๋“œ : Backend' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [Spring WebFlux] 1. Mono์™€ Flux์— ๋Œ€ํ•œ ์ดํ•ด(2) : ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” operator (method)
    • [Spring WebFlux] 1. Mono์™€ Flux์— ๋Œ€ํ•œ ์ดํ•ด(1) : ์ž‘๋™ ๋ฐฉ์‹๊ณผ ์ดํ•ด
    • [Spring WebFlux] 0. ๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์†Œ๊ฐœ
    • [Spring] ์Šคํ”„๋ง์˜ ํ•ต์‹ฌ ๊ฐœ๋…, DI / IoC๋ž€ ๋ฌด์—‡์ธ๊ฐ€? (์˜์กด์„ฑ ์ฃผ์ž…, ์ œ์–ด์˜ ์—ญ์ „)
    ๊ฐœ๋ฐœ์ž HOON
    ๊ฐœ๋ฐœ์ž HOON
    ์ข‹์€ ๋ฐฑ์—”๋“œ ์—”์ง€๋‹ˆ์–ด๊ฐ€ ๋˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ก์„ ๋ชจ์•˜์Šต๋‹ˆ๋‹ค. # ์ฃผ๋‹ˆ์–ด # ๋ฐฑ์—”๋“œ # ๊ฐœ๋ฐœ์ž

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”