ํน์ ํ ์ด๋ธ์์ ๋ฆฌ์คํธ ํ์์ผ๋ก ๋ฐ์ดํฐ ์ ์ฅํ๊ณ ์ถ์ ๊ฒฝ์ฐ
RDBMS๋ ํ ์ด๋ธ ์์ ๋ฆฌ์คํธ๋ก ์ ์ฅ์ด ๋ถ๊ฐ. ์ฆ ๋ค๋ฅธ ํ ์ด๋ธ๋ก ๋นผ๋ด์ผ ํจ
(๋นผ๋ธ ํ ์ด๋ธ์ Id์ ์ปฌ๋ผ ์ ๋ถ๋ฅผ pk๋ก ๊ฐ์ง๋ค.)
Ex)
//์ฃผ์
@Embedded
private Address homeAddress;
//HashSet
@ElementCollection
@CollectionTable(name = "favorite_food", joinColumns =
@JoinColumn(name = "member_id")) // FK๋ก ์ก๊ธฐ ์ํจ
private Set<String> favoriteFoods = new HashSet<>();
//ArrayList
@ElementCollection
@CollectionTable(name = "address", joinColumns =
@JoinColumn(name = "member_id"))
@Column(name = "food_name")
private List<Address> addressHistory = new ArrayList<>();
Member member = new Member();
member.setUsername("member1");
member.setHomeAddress(new Address("homeCity","street","1111"));
member.getFavoriteFoods().add("์นํจ");
member.getFavoriteFoods().add("์กฑ๋ฐ");
member.getFavoriteFoods().add("ํผ์");
member.getAddressHistory().add(new Address("old1","street","1111"));
member.getAddressHistory().add(new Address("old2","street","1111"));
em.persist(member);
์คํ๊ฒฐ๊ณผ member์ address, favorite food์ ์ ๋ถ ๊ฐ์ด ๋ง๊ฒ ๋ค์ด๊ฐ๋ค.
(em.persist ํ๋ฒ ์คํ์ ํตํด ์ ๋ถ ๊ฐ์ด ๋ค์ด๊ฐ) ->
why? ๊ฐ ํ์ ์ปฌ๋ ์ ๋ ๊ฐ ํ์ ์ด๊ธฐ ๋๋ฌธ์ member์ ์์กด.
์์์ฑ ์ ์ด(cascade) + ๊ณ ์๊ฐ์ฒด ์ ๊ฑฐ ๊ธฐ๋ฅ์ ํ์๋ก ๊ฐ์ง๋ค.
๊ฐ ํ์ collection์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ฐ๋ก๋ฉ
๊ฐ ํ์ ์ปฌ๋ ์ update๋ ์ด๋ป๊ฒ?
Ex1)
//์นํจ -> ํ์
findMember.getFavoriteFoods().remove("์นํจ");
findMember.getFavoriteFoods().add("ํ์");
์ญ์ ํ๊ณ ์๋ก ๋ง๋ค์ด์ผ ํจ
Ex2)
//old1 -> newCity1
findMember.getAddressHistory().remove(new Address("old1", "street", "1111"));
findMember.getAddressHistory().add(new Address("newCity1","street","1111"))
+) ๊ทธ๋ฅ ๊ฐ ํ์ ์ ๋ณ๊ฒฝ์?
Address a = findMember.getHomeAddress();
findMember.setHomeAddress(new Address("newCity", a.getStreet(), a.getZipcode()));
์์ ๊ฐ์ด ์๋ก ๊ฐ์ฒด ๊ฐ์๋ผ์์ผ ํจ
๊ฒฐ๋ก :
- ๊ฐ ํ์ ์ปฌ๋ ์ ์ ๊ฒฝ์ฐ์๋ ํด๋น ์ปฌ๋ ์ ์ด ๋ค์ด์๋ Member(์์)์ ์์กด๊ด๊ณ๋ฅผ ์ ๋ถ ๋งก๊ธด๋ค.
- ๊ฐ ์ถ์ ์ด ๊ต์ฅํ ์ด๋ ต๋ค. -> ์ค๋ฌด์์๋ ์ํฉ์ ๋ฐ๋ผ ๊ฐ ํ์ ์ปฌ๋ ์ ๋์ ์ ์ผ๋๋ค ๊ด๊ณ๋ฅผ ๊ณ ๋ ค
์ผ๋๋ค ๊ด๊ณ๋ก ํ์!!!(๋จ๋ฐฉํฅ)
// @ElementCollection
// @CollectionTable(name = "address", joinColumns =
// @JoinColumn(name = "member_id"))
// @Column(name = "food_name")
// private List<Address> addressHistory = new ArrayList<>();
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "member_id")
private List<AddressEntity> addressHistory = new ArrayList<>();
//AddressEntity๋ ํ์์ ์ํฐํฐ ๋ง๋ค๋ ๊ฒ์ฒ๋ผ ๋ง๋ค๋ฉด ๋๋ค.(๊ธฐ๋ณธ ์ํฐํฐ)
๊ฐํ์ ์ปฌ๋ ์ ๋ณด๋ค ์ด๋ ๊ฒ ์ผ๋๋ค ๊ด๊ณ๋ก ํธ๋๊ฒ์ด ๊ฐ ๋ณ๊ฒฝ์ด๋ ์ฌ๋ฌ ์ธก๋ฉด์์ ํจ์ฌ ์ข์.
๊ฒฐ๊ณผ :
-> ๊ฐํ์ ์ ์ ๋ง ๊ฐ ํ์ ์ด๋ผ ํ๋จ๋ ๋๋ง ์ฌ์ฉ (์ง์์ ์ผ๋ก ๊ฐ ์ถ๊ฐ ๋ฐ ๋ณ๊ฒฝ ํ์ํ ๊ฒฝ์ฐ์๋ ๊ฐ ํ์ ์ด ์๋๋ผ ์ํฐํฐ!!)
'BACKEND > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
SpringBoot API ์ฃผ์ํ ์ (2) | 2022.01.27 |
---|---|
๊ฐ์ฒด์งํฅ์ฟผ๋ฆฌ (0) | 2022.01.19 |
์๋ฒ ๋๋ ํ์ ์ฌ์ฉ๋ฐฉ๋ฒ (0) | 2022.01.18 |
SpringBoot JPA CASCADE ์์ (0) | 2022.01.17 |
ํ๋ก์ (0) | 2022.01.16 |