๊ด€๋ฆฌ ๋ฉ”๋‰ด

๐‘†๐‘ข๐‘›๐‘ โ„Ž๐‘–๐‘›๐‘’ ๐‘Ž๐‘“๐‘ก๐‘’๐‘Ÿ ๐‘Ÿ๐‘Ž๐‘–๐‘›โœง

[JPA] @Enumerated, @Converter ๋ณธ๋ฌธ

@Enumerated

์ž๋ฐ” enum ํƒ€์ž…์„@Enumerated ์• ๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ์—”ํ‹ฐํ‹ฐ ๋งคํ•‘ํ• ์ˆ˜ ์žˆ๋‹ค. 



@Enumerated ์–ด๋…ธํ…Œ์ด์…˜์—๋Š”

  • EnumType.ORIGINAL : enum ์ˆœ์„œ(์ˆซ์ž) ๊ฐ’์„ DB์— ์ €์žฅ
  • EnumType.STRING: enum ์ด๋ฆ„ ๊ฐ’์„ DB์— ์ €์žฅ

๋‘๊ฐ€์ง€ ํƒ€์ž…์ด ์žˆ๋‹ค. 

 

 

์˜ˆ๋กœ ๋“ค์–ด,

@AllArgsConstructor
public enum UserRole {

    ROLE_ADMIN("๊ด€๋ฆฌ์ž"),

    ROLE_USER("ํšŒ์›");

    private final String description;
}
@Column(nullable = false)
@Enumerated(EnumType.ORDINAL)
private UserRole roles;

ํ•ด๋‹น enum์„ ORIDINAL๋กœ ์ง€์ •ํ•˜๊ณ  role์†์„ฑ์„ ๊ฐ๊ฐ ์„ค์ •ํ•˜๋ฉด DB์— 

ROLE_ADMIN์€ 1 ๋กœ ์ €์žฅ๋˜๊ณ 

ROLE_USER์€ 2 ๋กœ ์ €์žฅ๋œ๋‹ค. 
STRINGํƒ€์ž…์œผ๋กœ ์ง€์ •ํ•˜๋ฉด "ROLE_ADMIN", "ROLE_USER" ๋ฌธ์ž์—ด๋กœ ์ €์žฅ๋œ๋‹ค. 

 

ํ•˜์ง€๋งŒ ORDINAL๋กœ ์„ค์ • ํ›„ enum๊ฐ’๋“ค์˜ ์ˆœ์„œ๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ์ž˜๋ชป ์ฝ์–ด์˜ค๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, 

STRING ์„ค์ •์€ ๋‚˜์ค‘์— ๋ฌธ์ž์—ด์ด ๋ฐ”๋€Œ๋ฉด ๋งž๋Š” ๊ฐ’์ด ์—†์–ด์„œ DB์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ๋•Œ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. ๋˜ํ•œ ๋ฌธ์ž์—ด ์ž์ฒด๊ฐ€ ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— DB ๊ณต๊ฐ„ ๋‚ญ๋น„๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

์ด๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์€ converter ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 


Attribute Converter

Attribute Converter๋Š” Entity์™€ DB์‚ฌ์ด์—์„œ ์†์„ฑ์˜ ๋ณ€ํ™˜์„ ๋‹ด๋‹นํ•œ๋‹ค.



์˜ˆ๋กœ ๋“ค์–ด ์„ฑ๋ณ„ (gender)์„ DB์— 'w', 'm'์œผ๋กœ ์ €์žฅํ•˜๊ณ ์‹ถ์„๋•Œ๋‚˜ ์—”ํ‹ฐํ‹ฐ์—๋Š” boolean, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—๋Š” YN ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ์‹ถ์„๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

 

 

๋ช…์„ธ์— ์žˆ๋Š” ์ฒซ ๋ฒˆ์งธ ์ œ๋„ค๋ฆญ X๋Š” Entity์˜ Field ์ž๋ฃŒํ˜•, ๋‘ ๋ฒˆ์งธ ์ œ๋„ค๋ฆญ Y๋Š” Database Column ์ž๋ฃŒํ˜•์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.  ๊ตฌํ˜„์€ ๊ฐ„๋‹จํ•œ๋ฐ 2๊ฐœ์˜ ๋ฉ”์†Œ๋“œ convertToDatabaseColumn์™€ convertToEntityAttribute๋ฅผ ๊ตฌํ˜„ํ•จ์œผ๋กœ์จ Converter๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

 

@Converter
public class UserRoleTypeConverter implements AttributeConverter<UserRole, Integer> {

    @Override
    public Integer convertToDatabaseColumn(UserRole attribute) {
        if (attribute == null) return null;
        return (attribute == ROLE_ADMIN) ? 0 : 1;
    }

    @Override
    public UserRole convertToEntityAttribute(Integer dbData) {
        if (dbData == null) return null;
        return (dbData == 0) ? ROLE_ADMIN : ROLE_USER;
    }

 

ํ•„์ž๋Š” UserRole์˜ Enumํƒ€์ž…์„ DB์— Integer๋กœ ์ €์žฅํ•˜๋ คํ•œ๋‹ค.

 

์ด๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•œ Converter์„ JPA์˜ ๋งคํ•‘ ํด๋ž˜์Šค์—์„œ @Convert ์• ๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ด์„œ ๊ฐ’์„ ๋ณ€ํ™˜๋Œ€์ƒ ํ”„๋กœํผํ‹ฐ์— ์ปจ๋ฒ„ํ„ฐ๋ฅผ ์ง€์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. 

@Column(nullable = false)
@Convert(converter = UserRoleTypeConverter.class)
private UserRole roles;

 

ํ•˜์ง€๋งŒ @Converter๋ฅผ ์“ธ๋•Œ ์ฃผ์˜ํ• ์ ์ด ์žˆ๋Š”๋ฐ ์•„๋ž˜ ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์„๊ฒƒ๊ฐ™๋‹ค.

 

https://msolo021015.medium.com/jpa%EC%9D%98-attributeconverter%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%A0-%EB%95%8C-%EC%A3%BC%EC%9D%98%ED%95%A0-%EC%A0%90-e27a824f3018

 

JPA์˜ AttributeConverter๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ์˜ํ•  ์ 

AttributeConverter๋Š” ์ปค์Šคํ…€ํ•œ Value Object๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๊ฑฐ๋‚˜, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋œ ๊ฐ’์„ ์ปค์Šคํ…€ํ•œ Value Object๋กœ ์ž๋™ ๋ณ€ํ™˜์„ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.

msolo021015.medium.com

 

 

 

 

 

 

 

์ฐธ๊ณ