์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ - ๊ธฐ๋ณธํธ์ ๊ณต๋ถํ๋ฉฐ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.
๊ฐ ํ์ ์ปฌ๋ ์ (์ฌ์ฉํ๋ฉด ์๋จ X, ์ํฐํฐ๋ก ์น๊ฒฉ์์ผ์ ์ฌ์ฉ O)
@Entity
public class Member {
..
@ElementCollection
@CollectionoTable(name = "FAVORITE_FOOD", joinColumn =
@JoinColumn(name = "MEMBER_ID"))
private Set<String> favoriteFoods = new HashSet<>();
@ElementCollection
@CollectionTable(name = "ADDRESS", joinColumn =
@JoinColumn(name = "MEMBER_ID"))
private List<Address> addressList = new ArrayList<>();
..
}
- ๊ฐ ํ์ ์ ํ๋ ์ด์ ์ ์ฅํ ๋ Set, List๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
- PK๋ฅผ ํ๋๋ง ์ฌ์ฉํ๋ฉด ๊ฐ ํ์ ์ด ์๋๊ณ , ์ํฐํฐ ๊ฐ๋ ์ด ๋๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ์ ๊ฐ ํ์ ์ ๋ฌถ์ด์ PK๋ก ์ค์ ํ๋ค.
- @ElementCollection (๊ฐ ํ์
์ด ์ปฌ๋ ์
์ด๋ผ๊ณ ๋ช
์), @CollectionTable(์ปฌ๋ ์
ํ
์ด๋ธ ์ด๋ฆ, ์กฐ์ธ ์ค์ ) ์ฌ์ฉํ๋ค.
- ๊ฐ ํ์ ์ด ํ๋์ผ ๋, Memberํด๋์ค์ ํ๋ ์์ฑ์ผ๋ก ๋ฃ์ผ๋ฉด ๋์ง๋ง, DB ๋ด๋ถ์ ์ปฌ๋ ์ ์ ๋ฃ์ ์ ์๋ ๊ธฐ๋ฅ์ ์๊ธฐ ๋๋ฌธ์ ๋ณ๋์ ํ ์ด๋ธ์ ์์ฑํด์ ๋งคํ(@CollectionTable) ์์ผ์ค์ผํ๋ค.
- ๊ฐ ํ์
์ปฌ๋ ์
์ Member ํ
์ด๋ธ์ ์์กดํ๊ธฐ ๋๋ฌธ์ Member์ ๋ผ์ดํ ์ฌ์ดํด์ ๋ฐ๋ผ๊ฐ๋ค.
- em.persist(member)๋ฅผ ํด์ฃผ๋ฉด ๊ฐ ํ์
์ปฌ๋ ์
๋ค๋ ํจ๊ป persist๊ฐ ๋๋ค.
- ์ด๊ฒ์ cascadeType.ALL + orphanRemoval = true์ ๊ฐ๋ค. (๊ฐ ํ์ ์ ์ด ๊ธฐ๋ฅ์ ํญ์ ํ์๋ก ๊ฐ์ง๊ฒ ๋๋ค.)
- em.persist(member)๋ฅผ ํด์ฃผ๋ฉด ๊ฐ ํ์
์ปฌ๋ ์
๋ค๋ ํจ๊ป persist๊ฐ ๋๋ค.
- ๊ฐ ํ์ ์ปฌ๋ ์ ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ฐ ์ ๋ต(fetch = FetchType.LAZY)์ ์ฌ์ฉํ๋ค.
๊ฐ ํ์ ์ปฌ๋ ์ ์ ์ ์ฝ ์ฌํญ
- ๊ฐ ํ์ ์ ์๋ณ์ ๊ฐ๋ ์ด ์๋ค. ( ๊ฐ์ฅ ํฐ ๋ฌธ์ ์ ! )
- ์๋ณ์๊ฐ ์๊ธฐ ๋๋ฌธ์, ๊ฐ์ ๋ณ๊ฒฝํ ๋ ์ถ์ ์ ํ ์๊ฐ ์๋ค.
- ๊ฐ ํ์ ์ปฌ๋ ์ ์ ๋ณ๊ฒฝ์ฌํญ์ด ๋ฐ์ํ๋ฉด , ์ฃผ์ธ ์ํฐํฐ์ ์ฐ๊ด๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๊ณ , ๊ฐ ํ์ ์ปฌ๋ ์ ์ ์๋ ํ์ฌ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ์ ์ฅํ๋ค.
๊ฐ ํ์ ์ปฌ๋ ์ ์ ๋์ (์ค๋ฌด์์๋ ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค.)
- ๊ฐ ํ์
์ปฌ๋ ์
์ ์ํฐํฐ๋ก ์น๊ฒฉ ์ํจ๋ค.
- ๊ธฐ์กด์ ๊ฐํ์ ์ปฌ๋ ์ ์ ์๋ฐฉํฅ์ ์ค๊ณ ํ ์ ์์๋๋ฐ, ์ํฐํฐ๋ก ์น๊ฒฉํจ์ผ๋ก์จ ์๋ฐฉํฅ ๋งคํ์ด ๊ฐ๋ฅํด์ก๋ค.
- ์๋ณ์ ๊ฐ๋ ์ด ์ถ๊ฐ ๋๋ฉด์, ๊ฐ์ ์ถ์ ํ ์ ์์๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ์ด ๋์๋ค.
๋จผ์ ๊ฐ ํ์ ์ปฌ๋ ์ ์ ์ํ ๋ณ๋์ ์ํฐํฐ๋ฅผ ์์ฑํ๋ค.
/**
* ๊ฐ ํ์
-> ์ํฐํฐ๋ก ์น๊ฒฉ
*
* ID๊ฐ ์์ด์ ์๋ณ์๊ฐ ์๊ฒจ์ ์ด์ ๋ง์๊ป ์์ ํ๊ณ ์ญ์ ํ ์์๋ค.
* ๊ฐ ํ์
์ปฌ๋ ์
๋์ ์ ์ผ๋๋ค ๊ด๊ณ๋ฅผ ์ฌ์ฉํ๋๊ฒ ์ ์ผ ๋ง ํธํ๋ค.
* ์ผ๋๋ค ๊ด๊ณ๋ฅผ ์ํ ์ํฐํฐ -> AddressEntity ๋ฅผ ๋ง๋ค๊ณ
* ์ฌ๊ธฐ์ private Address address; -> ๊ฐ ํ์
์ ์ฌ์ฉํ๋ค.
* ์์์ฑ ์ ์ด(Cascade.ALL) + orphanRemoval ๋ฅผ ์ฌ์ฉํด์ ๊ฐํ์
์ปฌ๋ ์
์ฒ๋ผ ์ฌ์ฉํด๋ผ
*/
@Entity
@Table(name = "ADDRESS")
public class AddressEntity {
@Id
@GeneratedValue
private Long id; // ID ์๋ณ์ ์๊น!!!!
@Embedded // ์ฌ์ค @Embeddable ๋ ์ค์ ํ๋๋ง ์ฐ๊ณ ๋๋จธ์ง๋ ์๋ต ํด๋ ๋๋ค. (๊ทธ์น๋ง ๋ ๋ค ์ฐ๋๊ฑธ ๊ถ์ฅํจ)
private Address address; // ์ฌ๊ธฐ์ ๊ฐ ํ์
์ ์ฌ์ฉํ๋ค.
public AddressEntity() {
}
// ์ด๋ฐ์์ผ๋ก ๊ฐ ํ์
์ ์์ฑ์๋ฅผ ์ด์ฉํด์ ์ธ์คํด์ค๋ฅผ ์์ฑํด ๋ฃ์ด์ค๋ค.
public AddressEntity(String city, String street, String zipcode) {
this.address = new Address(city, street, zipcode);
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
๊ทธ๋ฆฌ๊ณ Member์์ ๊ฐ ํ์ ์ ๋งคํํ๋๊ฒ ์๋๋ผ, ์ํฐํฐ๋ก ๋งคํ์ ํด์ค๋ค.
@Entity
public class Member {
..
//@ElementCollection
//@CollectionTable(name = "ADDRESS", joinColumns =
//@JoinColumn(name = "MEMBER_ID"))
//private List<Address> addressHistory = new ArrayList<>();
@OneToMany(cascade = CascadeType.ALL , orphanRemoval = true)
@JoinColumn(name = "MEMBER_ID")
private List<AddressEntity> addressHistory = new ArrayList<>();
}
Address ๊ฐ ํ์ ์ปฌ๋ ์ ์ ๊ฐ์ ๋ฃ์ ๋๋ ์ด๋ ๊ฒ ํ๋ฉด ๋๋ค.
<< Main.java >>
Member member = new Member();
member.getAddressHistory().add(new AddressEntity("city", "street", "zipcode"));
--------------------------------------------------------------------------------
<< Member.java >>
@OneToMany(cascade = ALL, orphanRemoval = true)
@JoinColumn(name = "MEMBER_ID")
private List<AddressEntity> addressHistory = new ArrayList<>();
--------------------------------------------------------------------------------
<< AddressEntity >>
private Address address;
public AddressEntity(String city, String street, String zipcode){
this.address = new Address(city, street, zipcode);
}
List์ ์ ์ฅํ๋ฉด -> member List์ ์ ์ฅ๋๊ณ , AddressEntity์์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ String๋ค์ Address์์ฑ์์๊ฒ ๋๊ฒจ์ฃผ๊ณ address ์ธ์คํด์ค๋ฅผ ์์ฑํด์ ๊ฐ์ง๊ณ ์๊ฒ ๋๋ค.
๊ทธ๋ฌ๋ฉด ์ธ์ ๊ฐ ํ์ ์ปฌ๋ ์ ์ ์ฌ์ฉํ๋๊ฐ?
์ ๋ง~ ๋จ์ํ select Box์ [ ( ) ์นํจ , ( ) ํผ์ ] ์ด๋ฐ์์ผ๋ก ์ค๋ณตํด์ ์ ํ ํ ์ ์๋ ์ฒดํฌ ๋ฐ์ค๊ฐ ์๋ค๊ณ ํ ๋, ์ด๋ด ๋ ์ฌ์ฉํ๋ ๊ฑฐ๋ค
์ด๋ ๊ฒ ์ง์ง ๋จ์ํ ๊ฒฝ์ฐ, ๊ฐ์ ์ถ์ ํ ํ์๊ฐ ์๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ๋ ์ฌ๋งํ๋ฉด ์ํฐํฐ๋ค.