์๋ฐ ORM ํ์ค JPA
Categories: jpa
ํด๋น ๊ฐ์๋ฅผ ๋ฐํ์ผ๋ก ์์ฑํ์์ต๋๋ค. https://www.inflearn.com/course/ORM-JPA-Basic
JPA
JPA๋ Java Persistent API์ ์ฝ์๋ก ์๋ฐ ์ง์์ ORM ๊ธฐ์ ํ์ค์ด๋ค. ๊ฐ์ฒด์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ด์ ์ฐ๊ฒฐ๋ค๋ฆฌ๋ฅผ ํด์ฃผ๋ ์ญํ ์ด๋ผ๊ณ ํ ์ ์๋ค.
JPA๋ ํ์ค ์ธํฐํ์ด์ค์ด๊ณ , ๊ตฌํ์ฒด๋ก๋ Hibernate๋ฅผ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
JPA๋ฅผ ์ฌ์ฉํ๋ฉด ์ป๋ ์ด์
- ๊ฐ์ฒด ์ค์ฌ์ผ๋ก ๊ฐ๋ฐํ ์ ์๋ค.
- ์์ฐ์ฑ ์ฆ๊ฐ : entityManger๋ฅผ ํตํด persist(), find(), remove() ๋ฉ์๋๋ก CRUD๋ฅผ ์์ฑํ ์ ์๋ค.
- 1์ฐจ์บ์์ ๋์ผ์ฑ ๋ณด์ฅ : ๊ฐ์ ํธ๋์ญ์ ์์์๋ ๊ฐ์ ์ํฐํฐ๋ฅผ ๋ฐํํ๋ค.
- ์ฐ๊ธฐ ์ง์ฐ : ํธ๋์ญ์ ์ ์ปค๋ฐํ ๋๊น์ง insert sql์ ๋ชจ์ผ๊ณ jdbc batch sql์ ํตํด ํ๋ฒ์ sql์ ์ ์กํ๋ค.
- ์ง์ฐ๋ก๋ฉ : ๊ฐ์ฒด๊ฐ ์ค์ ์ฌ์ฉ๋ ๋ ๋ก๋ฉ
- ์ฆ์๋ก๋ฉ : join ๊ตฌ๋ฌธ์ ์ฐ๊ฒฐ๋ ๊ฐ์ฒด๊น์ง ํ๋ฒ์ ๋ฏธ๋ฆฌ ์กฐํ
JPA ์๋ฆฌ
์ ํ๋ฆฌ์ผ์ด์ ์ ํ๋์ EntityManagerFactory๋ฅผ ์์ฑํด EntityManager๋ฅผ ์์ฑํ๋ค. EntityManager๋ ์ฐ๋ ๋๊ฐ์ ์์๊ณต์ ๋ฅผ ํ์ง ์๋๋ค. ๋ํ JPA์ ๋ชจ๋ ๋ณ๊ฒฝ์ ํธ๋์ญ์ ๋ด์์ ์ด๋ฃจ์ด ์ง๋ค.
JPQL
JPQL์ ์ํฐํฐ๋ฅผ ๋์์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฐ๋ค. SQL์ ์ถ์ํํ์ฌ ํน์ DB์ ์์กด์ ์ด์ง ์๊ณ , ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์คํํ ์ ์๋ค.
์์์ฑ ์ปจํ ์คํธ
- ์ํฐํฐ๋ฅผ ์๊ตฌ ์ ์ฅํ๋ ํ๊ฒฝ์ด๋ค.
- ์ํฐํฐ ๋งค๋์ ๋ฅผ ํตํด ์์์ฑ ์ปจํ ์คํธ์ ์ ๊ทผํ ์ ์๋ค.
์ํฐํฐ์ ์๋ช ์ฃผ๊ธฐ
- ๋น์์ : ์์์ฑ ์ปจํ ์คํธ์ ๊ด๋ จ์ด ์๋ ์๋ก์ด ์ํ
- ์์ : ์์์ฑ ์ปจํ ์คํธ์๊ฒ ๊ด๋ฆฌ๋๊ณ ์๋ ์ํ
- ์ค์์ : ์์์ฑ ์ปจํ ์คํธ์์ ๋ถ๋ฆฌ๋ ์ํ
- ์ญ์ : ์์์ฑ ์ปจํ ์คํธ์์ ์ญ์ ๋ ์ํ
//์ํฐํฐ๋ฅผ ์์ฑํ ์ํ(๋น์์)
Member member = new Member();
member.setId("member1");
member.setUsername("ํ์1");
//์ํฐํฐ๋ฅผ ์์
em.persist(member);
//ํ์ ์ํฐํฐ๋ฅผ ์์์ฑ ์ปจํ
์คํธ์์ ๋ถ๋ฆฌ, ์ค์์ ์ํ
em.detach(member);
//๊ฐ์ฒด๋ฅผ ์ญ์ ํ ์ํ(์ญ์ )
em.remove(member);
์์์ฑ ์ปจํ ์คํธ 1์ฐจ ์บ์
์์์ฑ ์ปจํ ์คํธ์ ์ ์ฅ๋๋ฉด 1์ฐจ ์บ์์์ ์ํฐํฐ๋ฅผ ์ฐพ์์จ๋ค. 1์ฐจ ์บ์์ ์๋ค๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ์ฟผ๋ฆฌ๊ฐ ๋ ๋ผ๊ฐ๋ค.
Member member = new Member();
member.setId("member1");
member.setUsername("ํ์1");
//1์ฐจ ์บ์์ ์ ์ฅ๋จ
em.persist(member);
//1์ฐจ ์บ์์์ ์กฐํ
Member findMember = em.find(Member.class, "member1");
์ํฐํฐ ๋ฑ๋ก
์ฐ๊ธฐ ์ง์ฐ SQL ์ ์ฅ์์ SQL์ ์ ์ฅํ๊ณ , 1์ฐจ ์บ์์ ์ํฐํฐ๋ฅผ ์ ์ฅํ๋ค. ํธ๋์ญ์ ์ด ์ปค๋ฐ๋๋ฉด ์ฐ๊ธฐ ์ง์ฐ ์ ์ฅ์์ ์ ์ฅ๋ ๋ด์ฉ์ DB๋ก ๋ด๋ ค์ค๋ค.
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
//์ํฐํฐ ๋งค๋์ ๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ํธ๋์ญ์
์ ์์ํด์ผ ํ๋ค.
transaction.begin(); // [ํธ๋์ญ์
] ์์
em.persist(memberA);
em.persist(memberB);
//์ฌ๊ธฐ๊น์ง INSERT SQL์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ณด๋ด์ง ์๋๋ค.
//์ปค๋ฐํ๋ ์๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ INSERT SQL์ ๋ณด๋ธ๋ค.
transaction.commit(); // [ํธ๋์ญ์
] ์ปค๋ฐ
์ํฐํฐ ์์ (๋ณ๊ฒฝ ๊ฐ์ง)
// ์์ ์ํฐํฐ ์กฐํ
Member memberA = em.find(Member.class, "memberA");
// ์์ ์ํฐํฐ ๋ฐ์ดํฐ ์์
memberA.setUsername("hi");
memberA.setAge(10);
//em.update(member) ์ด๋ฐ ์ฝ๋๊ฐ ์์ด์ผ ํ์ง ์์๊น?
transaction.commit(); // [ํธ๋์ญ์
] ์ปค๋ฐ
flush : ์์์ฑ ์ปจํ ์คํธ์ ๋ด์ฉ์ DB์ ๋ฐ์ํ๋ ๊ณผ์
์ํฐํฐ ์์ ์์๋ ๋ณ๊ฒฝ ๊ฐ์ง๊ฐ ์ผ์ด๋๋๋ฐ, flush ํ๋ ์์ ์ ์์์ฑ ์ปจํ ์คํธ์ ์๋ ์ค๋ ์ท๊ณผ ๋น๊ตํด UPDATE ์ฟผ๋ฆฌ๋ฅผ ๊ฐ์ด flush ์์ผ์ค๋ค.
ํ๋ฌ์๋ฅผ ํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
- em.flush() ๋ฅผ ์ง์ ํธ์ถํ๋ค.
- transaction์ commitํ๋ค.
- JPQL ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ค : JPQL ์ฟผ๋ฆฌ ์คํ ์ SQL์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ณด๋ด๊ธฐ ์ํด์๋ ์์ ์ปจํ ์คํธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋๊ธฐํ๊ฐ ๋์ด์์ด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ํฐํฐ ๋งคํ
@Entity: @Entity๊ฐ ๋ถ์ ํด๋์ค๋ JPA๊ฐ ๊ด๋ฆฌํ๋ค.
๊ฐ์ฒด - ํ ์ด๋ธ ๋งคํ : @Entity , @Table ํ๋ - ์ปฌ๋ผ ๋งคํ : @Column ๊ธฐ๋ณธํค ๋งคํ : @Id ์ฐ๊ด๊ด๊ณ ๋งคํ : @ManyToOne
์ํฐํฐ๋ฅผ ๋ฐํ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง ์๋ ์์ฑ
DDL์ ์ ํ๋ฆฌ์ผ์ด์ ์คํ ์ ์๋ ์์ฑํด์ฃผ๋ ๊ธฐ๋ฅ์ด ์๋ค.
์ต์ ์ 5๊ฐ์ง ์ข ๋ฅ๊ฐ ์๋ค.
- create : ๊ธฐ์กดํ ์ด๋ธ ์ญ์ ํ ๋ค์ ์์ฑ
- create-drop : create์ ๊ฐ์ผ๋ ์ข ๋ฃ์์ ์ ํ ์ด๋ธ DROP
- update : ๋ณ๊ฒฝ๋ถ๋ง ๋ฐ์
- validate : ์ํฐํฐ์ ํ ์ด๋ธ์ด ์ ์ ๋งคํ๋์๋์ง๋ง ํ์ธ
- none : ์ฌ์ฉํ์ง ์์
์ด์์์๋ create, create-drop, update๋ฅผ ์ฌ์ฉํด์๋ ์๋๊ณ , validate ๋๋ none์ ์ฌ์ฉํ์ฌ์ผ ํ๋ค.
ํ๋์ ์ปฌ๋ผ ๋งคํ
@Entity
public class Member {
@Id
private Long id;
@Column(name = "name")
private String username;
private Integer age;
@Enumerated(EnumType.STRING)
private RoleType roleType;
@Temporal(TemporalType.TIMESTAMP)
private Date createdDate;
@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate;
@Lob
private String description;
}
๋งคํ ์ด๋ ธํ ์ด์
@Column : ์ปฌ๋ผ ๋งคํ @Temporal : ๋ ์ง ํ์ ๋งคํ @Enumerated : enum ํ์ ๋งคํ @Lob : BLOB, CLOB ๋งคํ @Transient : ํน์ ํ๋๋ฅผ ์ปฌ๋ผ์ ๋งคํํ์ง ์์(๋งคํ ๋ฌด์)
๊ธฐ๋ณธ ํค ๋งคํ
@Id @GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@GeneratedValue : ์๋์์ฑ ์ ๋ต๋ค
- IDENTITY: ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์, MYSQL
- SEQUENCE: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํ์ค ์ค๋ธ์ ํธ ์ฌ์ฉ, ORACLE(@SequenceGenerator ํ์)
- TABLE: ํค ์์ฑ์ฉ ํ ์ด๋ธ ์ฌ์ฉ, ๋ชจ๋ DB์์ ์ฌ์ฉ(@TableGenerator ํ์)
- AUTO: ๋ฐฉ์ธ์ ๋ฐ๋ผ ์๋ ์ง์ , ๊ธฐ๋ณธ๊ฐ
์ฐ๊ด๊ด๊ณ ๋งคํ
**๋จ๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ **
๋จ๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ์์๋ ์๋์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ํ์ชฝ์ผ๋ก๋ง ์ฐ๊ฒฐ ๋ ๊ฒฝ์ฐ์ด๋ค. Member ๊ฐ์ฒด์๋ง Team ๊ฐ์ฒด๊ฐ ์๊ณ , Team ๊ฐ์ฒด์๋ Member์ ๊ด๋ จ๋ ๋ด์ฉ์ด ์๋ค.
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
@Column(name = "USERNAME")
private String name;
private int age;
// @Column(name = "TEAM_ID")
// private Long teamId;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
}
** ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ **
@Entity
public class Member {
private Long id;
@Column(name = "USERNAME")
private String name;
private int age;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
}
@Entity
public class Team {
@Id
@GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "team")
List<Member> members = new ArrayList<Member>();
}
๊ฐ์ฒด์ ํ ์ด๋ธ์ ์ฐจ์ด
๊ฐ์ฒด์ ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ ๋งคํ์ ๋๊ฐ์ ๋จ๋ฐฉํฅ ๋งคํ๊ณผ ๊ฐ๋ค.
-
๊ฐ์ฒด
ํ์ -> ํ ( ๋จ๋ฐฉํฅ ) ํ -> ํ์ ( ๋จ๋ฐฉํฅ )
-
ํ ์ด๋ธ ํ ์ด๋ธ์ ์ธ๋ํค๋ก ๋ ํ ์ด๋ธ์ ์ฐ๊ด๊ด๊ณ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ฐ๊ด๊ด๊ณ 1๊ฐ๋ก ์๋ฐฉํฅ์ ๊ด๋ฆฌํ ์ ์๋ค.
๊ฐ์ฒด์์๋ ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ ๋งคํ์ ๊ฒฝ์ฐ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด ํ์ํ๋ค.
์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ
- ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ๋ง ์ธ๋ํค๋ฅผ ๊ด๋ฆฌ
- ๋ ๊ฐ์ฒด ์ค ํ๋๋ง ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด ๋๋ค
- ์ฃผ์ธ์ด ์๋์ชฝ์ ์ฝ๊ธฐ๋ง ๊ฐ๋ฅ
- ์ฃผ์ธ์ด ์๋๋ฉด mappedBy ์์ฑ์ผ๋ก ์ฃผ์ธ์ ์ง์ ํด์ผ ํ๋ค
- ์ธ๋ํค๊ฐ ์๋ ์ชฝ์ ์ฃผ์ธ์ผ๋ก ์ ํ๊ธฐ
์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์์
-
์๋ฐฉํฅ ๋งคํ์ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ๊ฐ์ ์ ๋ ฅํด์ผ ํ๋ค. (์์ํ ๊ฐ์ฒด ๊ด๊ณ๋ฅผ ๊ณ ๋ คํ๋ฉด ํญ์ ์์ชฝ๋ค ๊ฐ์ ์ ๋ ฅํด์ผ ํ๋ค.)
-
์ฐ๊ด๊ด๊ณ ํธ์ ๋ฉ์๋๋ฅผ ์์ฑํ์ ์๋ฐฉํฅ ๋งคํ์์ ๋ฌดํ ๋ฃจํ๋ฅผ ์กฐ์ฌํ์(toString(), lombok, JSON ์์ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ)
์๋ฐฉํฅ ๋งคํ ์ ๋ฆฌ
- ๋จ๋ฐฉํฅ ๋งคํ๋ง์ผ๋ก๋ ์ด๋ฏธ ์ฐ๊ด๊ด๊ณ ๋งคํ์ ์๋ฃ
- ์๋ฐฉํฅ ๋งคํ์ ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก ์กฐํ(๊ฐ์ฒด ๊ทธ๋ํ ํ์) ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋ ๊ฒ ๋ฟ
- JPQL์์ ์ญ๋ฐฉํฅ์ผ๋ก ํ์ํ ์ผ์ด ๋ง์
- ๋จ๋ฐฉํฅ ๋งคํ์ ์ ํ๊ณ ์๋ฐฉํฅ์ ํ์ํ ๋ ์ถ๊ฐํด๋ ๋จ (ํ ์ด๋ธ์ ์ํฅ์ ์ฃผ์ง ์์)
์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ์ ํ๋ ๊ธฐ์ค
- ๋น์ฆ๋์ค ๋ก์ง์ ๊ธฐ์ค์ผ๋ก ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ์ ํํ๋ฉด ์๋จ
- ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ์ธ๋ํค์ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ํด์ผํจ ```java Team team = new Team(); team.setName(โTeamAโ); em.persist(team);
Member member = new Member(); member.setName(โmember1โ);
team.getMembers().add(member); //์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ๊ฐ ์ค์ member.setTeam(team); em.persist(member); ```
๋ค์ํ ์ฐ๊ด๊ด๊ณ ๋งคํ
ManyToOne ๋ค๋์ผ ๊ด๊ณ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ์ฐ๊ด๊ด๊ณ ์ธ๋ํค๊ฐ ์๋ ์ชฝ์ด ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด๋ค.
OneToMany
์ผ๋๋ค ๊ด๊ณ์์๋ ํญ์ Many ์ชฝ์ ์ธ๋ํค๊ฐ ์๋ค.
- ํ ์ด๋ธ ์ผ๋๋ค ๊ด๊ณ๋ ํญ์ ๋ค(N)์ชฝ์ ์ธ๋ํค๊ฐ ์์
- ๊ฐ์ฒด์ ํ ์ด๋ธ์ ์ฐจ์ด ๋๋ฌธ์ ๋ฐ๋ํธ ํ ์ด๋ธ์ ์ธ๋ํค๋ฅผ ๊ด๋ฆฌํ๋ ํน์ดํ ๊ตฌ์กฐ
- @JoinColumn์ ๊ผญ ์ฌ์ฉํด์ผ ํจ. ๊ทธ๋ ์ง ์์ผ๋ฉด ์กฐ์ธ ํ ์ด๋ธ ๋ฐฉ์์ ์ฌ์ฉํจ(์ค๊ฐ์ ํ ์ด๋ธ์ ํ๋ ์ถ๊ฐํจ)
์ผ๋๋ค ๋จ๋ฐฉํฅ ๋งคํ์ ๋จ์
- ์ํฐํฐ๊ฐ ๊ด๋ฆฌํ๋ ์ธ๋ํค๊ฐ ๋ค๋ฅธ ํ ์ด๋ธ์ ์์
- ์ฐ๊ด๊ด๊ณ ๊ด๋ฆฌ๋ฅผ ์ํด ์ถ๊ฐ๋ก ์ธ๋ํค์ ๊ด๋ จํ์ฌ UPDATE SQL ์คํ
- ์ผ๋๋ค ์๋ฐฉํฅ์ ๊ฒฝ์ฐ ๊ณต์์ ์ธ ํ์ค์คํ์ ์๋๋ฉฐ ๊ถ์ฅํ์ง ์๋๋ค.
= > ์ผ๋๋ค ๋จ๋ฐฉํฅ ๋งคํ๋ณด๋ค๋ ๋ค๋์ผ ์๋ฐฉํฅ ๋งคํ์ ์ฌ์ฉํ์
OneToOne
- ์ผ๋์ผ ๊ด๊ณ๋ ๊ทธ ๋ฐ๋๋ ์ผ๋์ผ
- ์ฃผํ ์ด๋ธ์ด๋ ๋์ํ ์ด๋ธ ์ค์ ์ธ๋ํค ์ ํ ๊ฐ๋ฅ
- ์ธ๋ ํค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๋ํฌ(UNI) ์ ์ฝ์กฐ๊ฑด ์ถ๊ฐ
์ฃผํ ์ด๋ธ์ ์ธ๋ํค๊ฐ ์๋ ๊ฒฝ์ฐ
- ์ฃผ ๊ฐ์ฒด๊ฐ ๋์ ๊ฐ์ฒด์ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง๋ ๊ฒ์ฒ๋ผ ์ฃผ ํ ์ด๋ธ์ ์ธ๋ํค๋ฅผ ๋๊ณ ๋์ ํ ์ด๋ธ์ ์ฐพ์
- ๊ฐ์ฒด์งํฅ ๊ฐ๋ฐ์ ์ ํธ
- JPA ๋งคํ ํธ๋ฆฌ(์ฃผํ ์ด๋ธ์ด๋ฏ๋ก ๋จ๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ๋ง ์ค์ ) ์ฅ์ : ์ฃผ ํ ์ด๋ธ๋ง ์กฐํํด๋ ๋์ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ์๋์ง ํ์ธ ๊ฐ๋ฅ ๋จ์ : ๊ฐ์ด ์์ผ๋ฉด ์ธ๋ ํค์ null ํ์ฉ
๋์ํ ์ด๋ธ์ ์ธ๋ํค๊ฐ ์๋ ๊ฒฝ์ฐ
- ๋์ ํ ์ด๋ธ์ ์ธ๋ ํค๊ฐ ์กด์ฌ
- ์ ํต์ ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ๋ฐ์ ์ ํธ ์ฅ์ : ์ฃผ ํ ์ด๋ธ๊ณผ ๋์ ํ ์ด๋ธ์ ์ผ๋์ผ์์ ์ผ๋๋ค ๊ด๊ณ๋ก ๋ณ๊ฒฝํ ๋ ํ ์ด๋ธ ๊ตฌ์กฐ ์ ์ง ๋จ์ : ํ๋ก์ ๊ธฐ๋ฅ์ ํ๊ณ๋ก ์ง์ฐ ๋ก๋ฉ์ผ๋ก ์ค์ ํด๋ ํญ์ ์ฆ์ ๋ก๋ฉ๋จ ๋จ์ : ๋์ํ ์ด๋ธ์ ์ธ๋ํค๊ฐ ์์ผ๋ฏ๋ก ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ ์ค์ ํ์
ManyToMany
- ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ ๊ทํ๋ ํ ์ด๋ธ 2๊ฐ๋ก ๋ค๋๋ค ๊ด๊ณ๋ฅผ ํํํ ์ ์๋ค.
- ์ฐ๊ฒฐ ํ ์ด๋ธ์ ํตํด์ ์ผ๋๋ค, ๋ค๋์ผ ๊ด๊ณ๋ก ํ์ด๋ด์ผํจ
ManyToMany๋ฅผ ์ผ๋๋ค ํน์ ๋ค๋์ผ๋ก ํ์ด๋ด์ด ์๋ก์ด ์ํฐํฐ๋ฅผ ์์ฑํ๋ ๊ฒ์ด ๋ฐ๋์งํจ.
Leave a comment