์ด๋ค ํ๋๋ฅผ ์ผ๋ฐ์ ์ธ ๋ฌธ์์ด๋ก ๋๋ ๊ฒ์ด ์๋
์๋ฏธ ์๋ ๊ฐ์ฒด๋ก ๋ง๋ค์ด์ผ ํ๋ ๊ฒฝ์ฐ
@Embeddable๊ณผ @Embedded๋ฅผ ๋ถ์ธ๋ค.
๋ ์์ธํ๊ฒ ์์๋ณด์.
1. @Embeddable๊ณผ @Embedded
- @Embeddable์ ๊ฐ ํ์ ์ ์ ์ํ๋ ๊ณณ์ ํ์ํ๋ค.
- @Embedded๋ ๊ฐ ํ์ ์ ์ฌ์ฉํ๋ ๊ณณ์ ํ์ํ๋ค.
- ์๋ฒ ๋๋ ํ์ ์ ๋ณตํฉ ๊ฐ ํ์ ์ผ๋ก ๋ถ๋ฆฌ๋ฉฐ ์๋ก์ด ๊ฐ ํ์ ์ ์ง์ ์ ์ํ์ฌ ์ฌ์ฉํ๋ JPA์ ๋ฐฉ๋ฒ์ ์๋ฏธํ๋ค.
- ์๋ ์์๋ฅผ ๋ณด๋ฉด์ ๋ ์ฝ๊ฒ ์ดํดํด๋ณด์.
- @Embedded X
import jakarta.persistence.*;
@Entity
@Table(name = "users")
public class User {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// ์๋ฒ ๋๋๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ์ด๋ ๊ฒ 3๊ฐ์ ํ๋๊ฐ ์๊ธด๋ค.
private String city;
private String street;
private String zipcode;
}
๋ฐฐ์ก์ง๋ฅผ ์ ๋ ฅํ๋ ์ํฉ์ ์๊ฐํด๋ณด์. ๋ณดํต ์ฃผ์๋ ํ๋์ ๊ฐ์ฒ๋ผ ๋ณด์ด์ง๋ง, ์ค์ ๋ก๋ ์ + ๋๋ก๋ช ์ฃผ์ + ์ฐํธ๋ฒํธ๊ฐ ํฉ์ณ์ ธ ์๋ค. ์์ ์ฝ๋๊ฐ ์ด ๊ฐ๋ค์ ์ ๋ถ User ์ํฐํฐ ์์ ์ง์ ๋ฃ์ ๊ฒ์ด๋ค.
- @Embedded O
import jakarta.persistence.*;
@Entity
@Table(name = "users")
public class User {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// ์๋ฒ ๋๋ ํ์
์ด๋ผ๊ณ ์ด๋
ธํ
์ด์
์ ๋ถ์ฌ์ ํ๋์ ํ๋๋ก ๊ด๋ฆฌํ๋ค.
@Embedded
private Address address;
}
๊ทธ๋ฐ๋ฐ ๊ฒฐ๊ตญ city, street, zipcode๋ ๊ฐ๊ฐ ๋ฐ๋ก ์กด์ฌํ๋ ๊ฐ๋ ์ด ์๋, ๋ชจ๋ ํฉ์ณ์ ธ์ ํ๋์ ์ฃผ์๋ก ํํ๋๋ ๊ฐ๋ค์ด๋ค. ์ฆ, User ์ ์ฅ์์๋ ์ฃผ์์ ๊ด๋ จ๋ ์ธ๋ถ ํ๋๋ฅผ ํ๋ํ ๋ค๊ณ ์๊ธฐ๋ณด๋ค, Address๋ผ๋ ํ์ ์ ๋ฌถ์ด์ ๊ด๋ฆฌํ๋ ํธ์ด ๋ ๊น๋ํ๋ค.
๊ทธ๋์ city, street, zipcode๋ฅผ Address ํด๋์ค ์์ ๋ชจ์๋๊ณ , User ์ํฐํฐ์์๋ ๊ทธ Address๋ฅผ ํ๋์ ํ๋์ฒ๋ผ ์ฌ์ฉํ๋ค.
@Embedded private Address address;
์ด๋ ๊ฒ ํ๋ฉด User ์ํฐํฐ๋ ์ฃผ์์ ์ธ๋ถ ๊ตฌ์กฐ๊น์ง ์ง์ ๊ด๋ฆฌํ์ง ์์๋ ๋๊ณ ์ฃผ์์ ๊ด๋ จ๋ ๊ฐ๋ค์ Address๋ผ๋ ๋ณ๋์ ํ์ ์์์ ๊น๋ํ๊ฒ ์ ๋ฆฌํ ์ ์๋ค. ์ด์ฒ๋ผ ์ํฐํฐ ์์์ ์ฌ๋ฌ ๊ฐ์ ํ๋์ ์๋ฏธ ์๋ ํ์ ์ผ๋ก ๋ฌถ์ด ์ฌ์ฉํ๋ ๊ฒ์ ์๋ฒ ๋๋ ํ์ ์ด๋ผ๊ณ ํ๋ค.
// ์ด์ ์๋ฒ ๋๋ ํ์
์ด ์ด๋ค ์์ธ์ง ์ ์ํด์ค์ผํ ์ฐจ๋ก์ด๋ค.
@Embeddable
public class Address {
private String city;
private String street;
private String zipcode;
protected Address() {}
public Address(String city, String street, String zipcode) {
this.city = city;
this.street = street;
this.zipcode = zipcode;
}
public String getCity() { return city; }
public String getStreet() { return street; }
public String getZipcode() { return zipcode; }
}
์ด์ ์ฃผ์ ํด๋์ค๋ฅผ ์ ์ํด์ผํ๋ค. ์๊น๋ ๋งํ๋ฏ์ด ์ฃผ์๋ ์, ๋๋ก๋ช , ์ฐํธ๋ฒํธ๊ฐ ๋ค์ด๊ฐ์ผํ๋ค. ์ด๊ฑธ User ์ํฐํฐ์ ๋ฃ๊ฒ ๋๋ฉด ์ฌ๋ฌ ์ปฌ๋ผ์ผ๋ก ๋๋ ์ ธ ์์ด์ผํ๋ค.
์ด๋ฐ ๊ฒฝ์ฐ ๊ฐ์ฒด์งํฅ์ ์ด์ง ์์ผ๋ฉฐ ์์ง๋ ฅ์ ๋จ์ด๋จ๋ฆฐ๋ค. ๊ทธ๋์ ๊ฐ์ฒด์์๋ User์ Address๋ฅผ ๋ถ๋ฆฌ์ํค๊ณ DB ํ ์ด๋ธ์๋ ํ๋์ ํ ์ด๋ธ์ ํํํ๊ฒ ๋ชจ๋ ์ปฌ๋ผ์ด ๋ค์ด๊ฐ๊ธธ ์ํ๋ ๊ฒฝ์ฐ @Embeddable์ ์ฌ์ฉํ๋ค.
- ์๋ง๋ ํ ์ด๋ธ์ ์ด๋ ๊ฒ ์์ฑ๋ ๊ฑฐ์ -
id (PK) name city street zipcode 1 ํ๊ธธ๋ ์์ธ์ ํ ํค๋๋ก 12345
๊ผญ ์ฌ๋ฌ ์ปฌ๋ผ์ผ๋ก ๋๋ ์ผํ ๊ฒฝ์ฐ๋ง ์ฌ์ฉํ๋ ๊ฒ์ด ์๋ ๊ฒ์ฆ ๋ก์ง์ด ํ์ํ ๊ฒฝ์ฐ ๊ฐ์ฒด๋ก ๋ฐ๋ก ๋ฌถ์ด์ ์ฌ์ฉํ ์ ์๋ค. ์๋ฅผ ๋ค์ด์ ์ฐํธ ๋ฒํธ๊ฐ 5์๋ฆฌ์ธ์ง ํฌ๋งท ๊ฒ์ฆ์ ํ๊ณ ์ถ๋ค๋ฉด ์ด๋ฐ ๊ฒฝ์ฐ์๋ ์๋ฒ ๋๋ ํ์ ์ผ๋ก ์ค์ ํด ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๋๋ค.
2. ๊ทธ๋์ ์ด๋ค ๊ฒฝ์ฐ ์ฌ์ฉํ๋๊ฐ?
- ๋ณ๋์ Entity๋ก ๋ง๋ค๊ธฐ ์ ๋งคํ ๊ฒฝ์ฐ
: Entity๊ฐ ๋๋ ค๋ฉด ์์ ๋ง์ ๊ณ ์ ํ ์๋ณ์(ID, PK)๊ฐ ์์ด์ผํ๊ณ ๊ทธ๊ฒ์ ์๋ช ์ฃผ๊ธฐ๊ฐ ๋ ๋ฆฝ์ ์ด์ด์ผํ๋ค. ๊ทธ๋ฐ๋ฐ ์ฃผ์, ๊ธฐ๊ฐ, ๊ธ์ก ๊ฐ์ ๋ฐ์ดํฐ๋ค์ ๋ ๋ฆฝ์ ์ผ๋ก ์กด์ฌํ ์ด์ ๊ฐ ์๋ค. ์๋๋ฉด ๊ฒฐ๊ตญ ํ์์ด ์์ด์ผํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ฆ, ๋์์ด ์์ ๋ง์ ๊ณ ์ ํ ์๋ณ์๋ฅผ ๊ฐ์ง ํ์๊ฐ ์๊ณ ์์ ํ Enity์ ์์ ํ ์์กด์ ์ผ ๋ ์๋ฒ ๋๋ ํ์ ์ ์ฌ์ฉํ๋ค. - ๊ทธ๋ฌ๋ ๋จ์ํ ๋ฌธ์์ด์ด ์๋ ์๋ฏธ์๋ ๊ฐ์ผ๋ก ๋ง๋ค์ด์ผํ๋ ๊ฒฝ์ฐ
: ์๊น๋ ๋งํ๋ฏ์ด, ๊ฒ์ฆ์ด ํ์ํ ์ ์๋ค. ์ฐํธ ๋ฒํธ๊ฐ 5์๋ฆฌ๊ฐ ๋ง๋์ง, ์๋ ์์ผ์ด ์ต๊ทผ์ด๊ฑฐ๋ ๋ฏธ๋๋ ์๋์ง ๋ฑ ์ผ๋ฐ์ ์ธ ๋ฌธ์์ด์ด์ด๋ ๊ทธ๊ฒ์ด ์ด๋ค ์๋ฏธ๋ฅผ ๊ฐ๋ ๊ฒฝ์ฐ ์๋ฒ ๋๋ ํ์ ์ด ํ์ํ๋ค. ๋ง์ฝ ์ฐํธ ๋ฒํธ๋ฅผ ์ผ๋ฐ์ ์ธ ๋ฌธ์์ด๋ก ๋๋ค๊ณ ๊ฐ์ ํ์. ์ฐํธ๋ฒํธ๋ฅผ ์ฌ์ฉ๊ณณ๋ง๋ค ์ฐํธ ๋ฒํธ๋ฅผ ๊ฒ์ฆํ๋ ๋ก์ง์ ์์ฑํด์ผํ๋ค. ๊ทธ๋ฐ๋ฐ ์ฐํธ ๋ฒํธ์ ๊ท์น์ด ๋ฐ๋๊ฒ ๋์๋ค๋ฉด? ๊ทธ๋ ๋ค๋ฉด ์์ฑํด๋ ์ฝ๋๋ฅผ ์ฐพ์๋ค๋๋ฉฐ ์์ ํด์ผํ๋ค. ์ด๋ ๊ฒ ์๋น์ค์ ๋๋ฉด ๊ฒ์ฆ ๋ก์ง์ด ํฉ์ด์ง๊ธฐ ์ฝ๊ธฐ ๋๋ฌธ์ ์๋ฏธ๊ฐ ์๋ค๋ฉด ์๋ฒ ๋๋ ํ์ ์ผ๋ก ์์ฑํ๋ ๊ฒ์ด ์ข๋ค. - ์ฃผ์) ์๋ฒ ๋๋ ํ์
์ ๋ถ๋ณ์ฑ์ ์งํฅํ๋ค.
: @Embeddable์ ๋จ์ง ์ด ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ์ํฐํฐ์ ํ ์ด๋ธ์ ์ปฌ๋ผ์ผ๋ก ๋ค์ด๊ฐ๋ค๊ณ ๋งคํ ์ค์ ๋ง ํด์ค ๋ฟ, ๊ฐ์ฒด๋ฅผ ๋ถ๋ณ์ผ๋ก ๋ง๋ค์ง๋ ์๋๋ค. ๋ค๋ง ๊ฐ๋ฐ์๋ ์๋ฒ ๋๋ ํ์ ์ผ๋ก ์์ฑํ ๊ฒฝ์ฐ ๋ถ๋ณ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํด์ผํ๋ค. ๋ง์ฝ Address ๊ฐ์ฒด์ Setter๊ฐ ์ด๋ ค์๋ค๊ณ ๊ฐ์ ํ์. ์ด ์ํ์์ ํ์1๊ณผ ํ์2๊ฐ ์ฐ์ฐํ ๊ฐ์ ์ฃผ์ ๊ฐ์ฒด๋ฅผ ๊ณต์ ํ๊ฒ ๋๋ฉด ํ์1์ด ์ฃผ์๋ฅผ ์์ ํ์ ๊ฒฝ์ฐ, ํ์2์ ์ฃผ์๋ ํจ๊ป ๋ณ๊ฒฝ๋๊ฒ ๋๋ค. ๊ทธ๋์ ์๋ฒ ๋๋ ํ์ ์ ์์ฑํ ๋, Setter๋ฅผ ์ ๋๋ก ๋ง๋ค์ง ์์์ผํ๊ณ ํ๋ ๋ณ๊ฒฝ์ด ํ์ํ๋ค๋ฉด ์์ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ํต์งธ๋ก ๊ฐ์๋ผ์์ผํ๋ค. ๋ ์์ฑ์๋ฅผ ํตํด์๋ง ์ต์ด ๊ฐ์ ์ธํ ํ๋๋ก ํด์ผํ๋ค.