๐ง ๊ฐ ํ์ ์ปฌ๋ ์
๊ฐ ํ์ ์ ์ปฌ๋ ์ ์ ๋ด์์ ์ฌ์ฉํ ๋, ํด๋น ์ปฌ๋ ์ ์ ๊ฐ ํ์ ์ปฌ๋ ์ ์ด๋ผ ํฉ๋๋ค.
(@OneToMany ์ฒ๋ผ ์ํฐํฐ๋ฅผ ์ปฌ๋ ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ์๋, Integer, String, ์๋ฒ ๋๋ ํ์ ๊ฐ์ ๊ฐ ํ์ ์ ์ปฌ๋ ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.)
๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ปฌ๋ ์ ์ ๋ด์ ์ ์๋ ๊ตฌ์กฐ๊ฐ ์์ต๋๋ค.
๋ฐ๋ผ์ ์ด๋ฅผ ์ ์ฅํ๊ธฐ ์ํด์๋ ๋ณ๋์ ํ ์ด๋ธ์ ๋ง๋ค์ด์ ์ ์ฅํด์ผ ํฉ๋๋ค.
์ด๋ ๊ฐ ํ์ ์ปฌ๋ ์ ์ ๊ฐ๋ ์ ์ผ๋ก ๋ณด๋ฉด 1๋ N ๊ด๊ณ์ ๋๋ค.
(๊ทธ๋ฆฌ๊ณ ๊ฐ ํ์ ์ ์ ์ฅํ๋ ํ ์ด๋ธ์ ๊ฐ ํ์ ์ ์์ ํ ์ํฐํฐ์ ๊ธฐ๋ณธ ํค์ ๋ชจ๋ ๊ฐ ํ์ ํ๋๋ฅผ ๋ฌถ์ด์ PK๋ก ์ฌ์ฉํ๋ฉฐ,
์ํฐํฐ์ ๊ธฐ๋ณธ ํค๋ฅผ PK๊ฒธ FK๋ก ์ฌ์ฉํฉ๋๋ค.)
๐ง @ElementCollection
๊ฐ ํ์ ์ปฌ๋ ์ ์ ๋งคํํ ๋ ์ฌ์ฉํฉ๋๋ค.
RDB์๋ ์ปฌ๋ ์ ๊ณผ ๊ฐ์ ํํ์ ๋ฐ์ดํฐ๋ฅผ ์ปฌ๋ผ์ ์ ์ฅํ ์ ์๊ธฐ ๋๋ฌธ์, ๋ณ๋์ ํ ์ด๋ธ์ ์์ฑํ์ฌ ์ปฌ๋ ์ ์ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค.
์ด๋ ํด๋น ํ๋๊ฐ ์ปฌ๋ ์
๊ฐ์ฒด์์ JPA์๊ฒ ์๋ ค์ฃผ๋ ์ด๋
ธํ
์ด์
์ด @ElementCollection ์
๋๋ค.
@Entity๊ฐ ์๋ Basic Type์ด๋ Embeddable Class๋ก ์ ์๋ ์ปฌ๋ ์ ์ ํ ์ด๋ธ๋ก ์์ฑํ๋ฉฐ One-To-Many ๊ด๊ณ๋ก ๋ค๋ฃน๋๋ค.
๐ง @CollectionTable
@ElementCollection์ @CollectionTable๊ณผ ํจ๊ป ์ฌ์ฉํฉ๋๋ค.
@CollectionTable์ ๊ฐ ํ์ ์ปฌ๋ ์ ์ ๋งคํํ ํ ์ด๋ธ์ ๋ํ ์ ๋ณด๋ฅผ ์ง์ ํ๋ ์ญํ ์ ์ํํฉ๋๋ค.
๋ง์ฝ ์ด๋ฅผ ์๋ตํ๋ค๋ฉด ๊ธฐ๋ณธ๊ฐ์ ์ด์ฉํ์ฌ ๋งคํํฉ๋๋ค.
๊ธฐ๋ณธ๊ฐ : {์ํฐํฐ์ด๋ฆ}_{์ปฌ๋ ์ ํ๋ ์ด๋ฆ}
@Entity
public class StudyGroup {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// Basic type
@ElementCollection(fetch = FetchType.LAZY)
@Column(name = "TOPIC_NAME")//String์ธ ๊ฒฝ์ฐ์ ํํด์ ์์ธ์ ์ผ๋ก ํ์ฉ, ์ด์ธ ํ์
์ @AttributeOverride๋ฅผ ์ฌ์ฉํด์ ํ
์ด๋ธ ์์ฑ์ ์ฌ์ ์ํ๋ค.
private Set<String> topicTags = new HashSet<String>();
// Embedded type
@ElementCollection
@CollectionTable(name="study_group_member", joinColumns = @JoinColumn(name= "study_group_id", referencedColumnName = "id"))
private Set<StudyGroupMember> members = new HashSet<StudyGroupMember>();
}
@Embeddable
public class StudyGroupMember {
private UUID memberId;
private Boolean isOwner;
}
์์ฑ๋๋ ํ ์ด๋ธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ฐธ๊ณ
- ๊ฐ ํ์ ์ปฌ๋ ์ ์ ์กฐํ ์ ์ง์ฐ๋ก๋ฉ ์ ๋ต์ ์ฌ์ฉํฉ๋๋ค.
- ๊ฐ ํ์ ์ ์๋ช ์ฃผ๊ธฐ๋ ๋ถ๋ชจ ์ํฐํฐ์ ์ํด ๊ด๋ฆฌ๋ฉ๋๋ค. ์ฆ ์์์ฑ ์ ์ด(Cascade ALL) + ๊ณ ์ ๊ฐ์ฒด ์ ๊ฑฐ ๊ธฐ๋ฅ์ ํ์๋ก ๊ฐ์ง๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค.
๐ง ์ฃผ์
โญ๏ธ ๊ฐ ํ์ ์ปฌ๋ ์ ์ ์ ์ฝ
- ๊ฐ ํ์ ์ ์ํฐํฐ์ ๋ค๋ฅด๊ฒ ์๋ณ์ ๊ฐ๋ ์ด ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ์ถ์ ์ด ์ด๋ ต์ต๋๋ค.
- ๊ฐ ํ์ ์ปฌ๋ ์ ์ ๋ณ๊ฒฝ ์ฌํญ(์ ์ฅ, ์ญ์ )์ด ๋ฐ์ํ๋ฉด, ์์ ํ๋ ์ํฐํฐ์ ์ฐ๊ด๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๊ณ , ํ์ฌ ๋จ์์๋ ๊ฐ์ ๋ชจ๋ ๋ค์ ์ ์ฅํฉ๋๋ค.(์์ ์์๋ ์ญ์ ๋ฅผ ์๋ก ๋ค์์ง๋ง, ์ ์ฅ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค.)
- ๊ฐ ํ์ ์ปฌ๋ ์ ์ ๋งคํํ๋ ํ ์ด๋ธ์ ๋ชจ๋ ์ปฌ๋ผ์ ๋ฌถ์ด์ ๊ธฐ๋ณธํค๋ฅผ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค. -> null ์ ๋ ฅ X, ์ค๋ณต ์ ์ฅ X
โญ๏ธ ๊ฐ ํ์ ์ปฌ๋ ์ ์ ๋์
๊ฐ ํ์ ์ปฌ๋์ ๋์ ์ ์ผ๋๋ค ๊ด๊ณ๋ฅผ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
- ์ผ๋๋ค ์ํฐํฐ๋ฅผ ๋ง๋ค๊ณ , ์ํฐํฐ์์ ๊ฐ ํ์ ์ ์ฌ์ฉํฉ๋๋ค.
- cascade์ ๊ณ ์ ๊ฐ์ฒด ์ ๊ฑฐ๋ฅผ ์ค์ ํด์ ๊ฐ ํ์ ์ปฌ๋ ์ ์ฒ๋ผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๐ง @ElementCollection๊ณผ @OneToMany์ ์ฐจ์ด
โญ๏ธ @ElementCollection
- ์ฐ๊ด๋ ๋ถ๋ชจ Entity ํ๋์๋ง ์ฐ๊ด๋์ด ๊ด๋ฆฌ๋ฉ๋๋ค. (๋ถ๋ชจ Entity์ ๋ ๋ฆฝ์ ์ผ๋ก ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.)
- ํญ์ ๋ถ๋ชจ์ ํจ๊ป ์ ์ฅ๋๊ณ ์ญ์ ๋๋ฏ๋ก cascade ์ต์ ์ ์ ๊ณตํ์ง ์์ต๋๋ค. (cascade = ALL ์ธ ์ ์ ๋๋ค.)
- ๋ถ๋ชจ Entity Id์ ์ถ๊ฐ ์ปฌ๋ผ(basic or embedded ํ์ )์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ณ์ ๊ฐ๋ ์ด ์์ผ๋ฏ๋ก ์ปฌ๋ ์ ๊ฐ ๋ณ๊ฒฝ ์, ์ ์ฒด ์ญ์ ํ ์๋ก ์ถ๊ฐํฉ๋๋ค.
โญ๏ธ @OneToMany / @ManyToMany
- ๋ค๋ฅธ Entity์ ์ํด ๊ด๋ฆฌ๋ ์๋ ์์ต๋๋ค.
- join table์ด๋ ์ปฌ๋ผ์ ๋ณดํต ID๋ง์ผ๋ก ์ฐ๊ด์ ๋งบ์ต๋๋ค.
Reference
[์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ - ๊น์ํ]
'๐๏ธ Spring > JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JPA] ๊ธฐ๋ณธ ํค(Primary Key)๋งคํ - @Id, @GeneratedValue (0) | 2021.12.14 |
---|---|
[JPA] ๊ธฐ๋ณธ ํค ๋งคํ - SEQUENCE, TABLE ์ ๋ต์ ์ต์ ํ (0) | 2021.12.14 |
[JPA] ํ๋์ ์ปฌ๋ผ ๋งคํ - @Access (0) | 2021.12.14 |
[JPA] ํ๋์ ์ปฌ๋ผ ๋งคํ - @Transient (0) | 2021.12.14 |
[JPA] ํ๋์ ์ปฌ๋ผ ๋งคํ - @Basic (0) | 2021.12.14 |