BackEnd/JPA

@Embeddable @Embedded μ–΄λ…Έν…Œμ΄μ…˜μ— λŒ€ν•΄ μ•Œμ•„λ³΄μž

hyunki.Dev 2023. 4. 24. 16:43

πŸ“Œ λ“€μ–΄κ°€λ©° 

@Embeddable κ³Ό @Embedded μ–΄λ…Έν…Œμ΄μ…˜μ€ Entityκ°€ λ‹¨μˆœν•  λ•Œμ—λŠ” 잘 μ‚¬μš©ν•˜μ§€ μ•Šμ§€λ§Œ Entity κ°€ λ³΅μž‘ν•΄μ§ˆ 수둝 가독성과 곡톡적인 의미λ₯Ό κ°–κ³  μžˆλŠ” μ»¬λŸΌμ„ ν•˜λ‚˜μ˜ 객체둜 μ‚¬μš©ν•˜κΈ° μœ„ν•΄ 자주 μ‚¬μš©ν•˜κ²Œ λ˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜μž…λ‹ˆλ‹€. 이번 ν¬μŠ€νŒ…μ—μ„œλŠ” ν•΄λ‹Ή μ–΄λ…Έν…Œμ΄μ…˜μ˜ μ‚¬μš©λ²•μ— λŒ€ν•΄ 정리해보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.


πŸ“Œ @Embeddable , @Embedded μ–΄λ…Έν…Œμ΄μ…˜ μ‚¬μš©ν•˜κΈ°

Embeddable μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜λŠ” κ°€μž₯ ν”ν•œ μ˜ˆμ‹œμΈ User Entityλ₯Ό μ •μ˜ν•˜λ©΄μ„œ

ν•΄λ‹Ή μ–΄λ…Έν…Œμ΄μ…˜μ˜ μ‚¬μš©λ²•μ„ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

μš°μ„  두 μ–΄λ…Έν…Œμ΄μ…˜μ€ 

@Embeddable : κ°’ νƒ€μž…μ„ μ •μ˜ν•˜λŠ” 곳에 ν‘œμ‹œ

@Embedded : κ°’ νƒ€μž…μ„ μ‚¬μš©ν•˜λŠ” 곳에 ν‘œμ‹œ

 

λ‹€μŒμ˜ μœ„μΉ˜μ—μ„œ μ‚¬μš©ν•˜κ²Œ λ©λ‹ˆλ‹€. 그럼 μ˜ˆμ‹œλ‘œ User Entityλ₯Ό λ§Œλ“€μ–΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

@Entity
@Table(name = "user")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long uid;
​
    private String name;
​
    private String phoneNum;
​
    private String zipCode; //우편번호
    private String wideAreaAddress; //κ΄‘μ—­μ£Όμ†Œ
    private String addressDetail; //μƒμ„Έμ£Όμ†Œ
}

 

User Entity μ—μ„œ μš°νŽΈλ²ˆν˜Έμ™€ κ΄‘μ—­μ£Όμ†Œ, μƒμ„Έμ£Όμ†Œ ν•„λ“œλŠ”

κ²°κ΅­ μ‚¬μš©μžμ˜ μ£Όμ†Œλ₯Ό ν‘œν˜„ν•˜λŠ” ν•„λ“œμž…λ‹ˆλ‹€.

 

ν•„λ“œμ˜ κ°œμˆ˜κ°€ μœ„μ™€ 같을 λ•Œμ—λŠ” 크게 λ¬Έμ œλ˜μ§€ μ•Šκ² μ§€λ§Œ

ν•„λ“œμ˜ κ°œμˆ˜κ°€ λ§Žμ•„μ§ˆμˆ˜λ‘ κ΄€λ¦¬ν•˜κΈ° μ–΄λ €μ›Œμ§ˆ κ²ƒμž…λ‹ˆλ‹€. μ΄λ•Œ Embeddable, Embedded μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

@Entity
@Table(name = "user")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long uid;
​
    private String name;
​
    private String phoneNum;
​
    @Embedded
    private Address address;
}

 

@Embeddable
public class Address {
    private String zipCode;
    private String wideAreaAddress;
    private String addressDetail;
}

 

우편번호, κ΄‘μ—­μ£Όμ†Œ, μƒμ„Έμ£Όμ†Œλ₯Ό λ¬Άμ–΄μ„œ ν•˜λ‚˜μ˜ Address 객체λ₯Ό λ§Œλ“€μ—ˆκ³ 

ν•΄λ‹Ή Address 객체λ₯Ό μ‚¬μš©ν•œ ν›„ @Embedded μ–΄λ…Έν…Œμ΄μ…˜μ„ 달아주면

Address μ»¬λŸΌμ„ ν¬ν•¨ν•˜μ—¬ DBκ°€ μƒμ„±λ©λ‹ˆλ‹€.

 


πŸ“Œ @AttributeOverride

@Embeddedλ₯Ό μ΄μš©ν•΄ 객체둜 Entity의 Column을 ν‘œν˜„ν•˜λ©΄, Column 이름이 μ€‘λ³΅λ˜λŠ” λ¬Έμ œκ°€ λ°œμƒν•˜κΈ°λ„ ν•©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ λ™μΌν•œ Address객체둜 μ—¬λŸ¬ 개의 ν•„λ“œλ₯Ό λ§Œλ“€λ©΄ Entity μž…μž₯μ—μ„œλŠ” μ€‘λ³΅λ˜λŠ” μ»¬λŸΌμ„ μ—¬λŸ¬κ°œ 생성해야 ν•˜κΈ° λ•Œλ¬Έμ— 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

 

μ΄λŸ¬ν•œ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ AttributeOverride λΌλŠ” μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•΄μ„œ

μ»¬λŸΌμ„ μ„ΈλΆ€μ μœΌλ‘œ 지정해 μ€˜μ•Ό ν•©λ‹ˆλ‹€.

 

@Entity
@Table(name = "user")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long uid;
​
    private String name;
​
    private String phoneNum;
​
    @Embedded
    private Address homeAddress; // 집 μ£Όμ†Œ
​
    @Embedded
    private Address companyAddress; //직μž₯ μ£Όμ†Œ
}

@Embeddedλ₯Ό μ‚¬μš©ν•˜λŠ” κ²½μš°μ— 객체의 이름이 μ•„λ‹Œ ν•΄λ‹Ή κ°μ²΄μ•ˆμ— μž‘μ„±λœ,

ν•„λ“œμ˜ 이름을 Column으둜 μ‚¬μš©ν•˜λ―€λ‘œ λ™μΌν•œ Address 객체λ₯Ό μ΄μš©ν•˜λ©΄ 쀑볡이 λ°œμƒν•©λ‹ˆλ‹€.

 

@Embedded
@AttributeOverride(name = "zipCode", column = @Column(name = "home_zipCode"))
@AttributeOverride(name = "wideAreaAddress", column = @Column(name = "home_wideAreaAddress"))
@AttributeOverride(name = "addressDetail", column = @Column(name = "home_addressDetail"))
private Address homeAddress;
​
@Embedded
@AttributeOverride(name = "zipCode", column = @Column(name = "company_zipCode"))
@AttributeOverride(name = "wideAreaAddress", column = @Column(name = "company_wideAreaAddress"))
@AttributeOverride(name = "addressDetail", column = @Column(name = "company_addressDetail"))
private Address companyAddress;

 

μœ„μ™€ 같이 AttributeOverride μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μ—¬ 쀑볡을 ν”Όν•˜κ³ 

κ°μ²΄μ•ˆμ˜ μ»¬λŸΌμ„ μž¬μ •μ˜ν•˜μ—¬ Address 객체λ₯Ό κ°–λŠ” μ»¬λŸΌμ„ λ‘κ°œ 이상 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

 

 

μ°Έκ³  :

https://galid1.tistory.com/592

https://dandev.tistory.com/m/entry/JPA-Embedded-Embeddable%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EB%A9%B0-%EC%96%B8%EC%A0%9C-%EC%82%AC%EC%9A%A9%ED%95%A0%EA%B9%8C-%F0%9F%A4%94