๐ง๐ป๐ป์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ(๋ฌดํ ๋ฃจํ)
JPA๋ก ๊ฐ๋ฐ์ ํ๋ค ๋ณด๋ฉด ์๋ฐฉํฅ์ผ๋ก ๋งคํํ์ฌ ์ฐธ์กฐ๊ฐ ํ์ํ ๋ชจ๋ธ๋ค์ด ์ข ์ข ์๋ค. ์ด๋ฌํ ๊ณผ์ ์์ ์๋ฐฉํฅ ๊ด๊ณ๋ฅผ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํ ํ๋ ค๊ณ ํ ๋ ๋ฌดํ์ผ๋ก ์ฐธ์กฐ๊ฐ ๋์ด StackOverFlow๋ฅผ ๋ฐ์์ํจ๋ค. ๊ทธ๋ฌ๋ ์ด๋ฌํ ๋ฌธ์ ๊ฐ ์๋ค๊ณ JPA๊ฐ ๊ฐ์ง ์ฅ์ ์ ํฌ๊ธฐํ๊ณ ๋จ๋ฐฉํฅ์ผ๋ก ๊ตฌ์ฑํ๊ธฐ์ ๋๋ฌด ๋นํจ์จ์ ์ด๋ค.
์ด๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ์์ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ์ค์ ํด์ฃผ์ด์ผ ํ๋ค.
์์ ์ํฐํฐ
@Entity
public class User {
@Id
@GeneratedValue
private Long id;
private String name;
private int age;
@ManyToOne
private Team team;
}
@Entity
public class Team {
@Id@GeneratedValue
@Column(name = "team_id")
private Long id;
private String name;
@OneToMany
private List<User> members = new ArrayList<>();
}
์์๋ก ์ ๋๊ฐ์ ์ํฐํฐ๊ฐ ์๋ค.
User์ Team์ ManyToOne์ ๊ด๊ณ์ด๊ณ Team๊ณผ User๋ OneToMany์ด๋ค.
OneToMany์ ๊ด๊ณ์ ๊ฒฝ์ฐ ์ฌ๋ฌ ๊ฑด์ ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งบ๊ธฐ ์ํด Collection์ ์ฌ์ฉํ์ฌ์ผ ํ๋ค.
OneToMany๋ @OneToMany ์ด๋ ธํ ์ด์ ์ ๋ถ์ฌ์ฃผ๋ฉด ๋๊ณ ManyToOne์ @ManyToOne์ ๋ถ์ฌ์ฃผ๋ฉด๋๋ค.
์ด์ ์๋ฐฉํฅ์ผ๋ก ๋์๋ค๋ฉด ์ฐ๊ด๊ด๊ณ ์ฃผ์ธ์ ์ ํด์ค์ผ ํ๋ค.
๋ง์ฝ ์ฐ๊ด๊ด๊ณ ์ฃผ์ธ์ ์ค์ ์ ์ ํด์ค๋ค๋ฉด ์ ์์๋ก ๋ค๋ฉด User๋ฅผ ์กฐํํ๋ฉด Team์ด ์กฐํ๊ฐ ๋๋ค. ๊ทธ๋ฆฌ๊ณ Team์์ User๋ฅผ ์กฐํํ๋ค.
์ด๋ฐ ์์ผ๋ก ๊ณ์ ์๋ก๋ฅผ ์ฐธ์กฐํ์ฌ ๋ฌดํ๋ฃจํ์ ๊ฐํ๋ค.
๋ฌดํ๋ฃจํ์ ๊ฐํ๋ฉด์ ์ ์ผ ์ฒ์ ๋งํ๋ StackOverFlow๊ฐ ๋ฐ์ํ๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์ฐ๊ด๊ด๊ณ ์ฃผ์ธ์ ์ ํด์ค์ผ๋ก์จ ํด๊ฒฐํ ์ ์๋ค.
๐ง๐ป๐ป์ฐ๊ด๊ด๊ณ ์ฃผ์ธ ์ค์
์ผ๋ฐ์ ์ผ๋ก ์๋ฐฉํฅ ๊ด๊ณ๋ฅผ ๋งบ์ผ๋ฉด ์ฐ๊ด๊ด๊ณ ์ฃผ์ธ์ ์ฃผ๋ก ์ธ๋ ํค๊ฐ ์ ์ฅ๋๋ ์ธก์ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ผ๋ก ์ง์ ํ๋ค.
์ธ๋ํค๊ฐ ์ ์ฅ๋๋ ์ํฐํฐ์์๋ @JoinColumn์ผ๋ก ์ ์ฅํ ์ธ๋ํค๊ฐ ์๋ ์ํฐํฐ์ ํค๋ฅผ name์์ฑ์ผ๋ก ์ธ๋ ํค๋ฅผ ์ง์ ํด์ฃผ๋ฉด ๋๋ค
@Entity
public class User {
.
.
.
@ManyToOne
@JoinColumn(name = "team_id")
private Team team;
}
์ด๋ฐ ์์ผ๋ก ์ธ๋ํค ์์ฑ์ ์ง์ ํด์ฃผ๊ณ ์ฃผ์ธ์ด ์๋ ์ํฐํฐ์๋ mappedBy๋ฅผ ํตํด ์ฃผ์ธ์ด ์ค์ ํ ํ๋๋ช ์ ํตํด ์ฐ๊ด๊ด๊ณ ์ฃผ์ธ์ ์ค์ ํ๋ค.
@Entity
public class Team {
.
.
.
@OneToMany(mappedBy = "team")
private List<User> Users = new ArrayList<>();
}
์ฃผ์ธ์ ์ค์ ํ๊ธฐ ์ํด User ์ํฐํฐ์ ์ธ๋ํค๋ก ์ค์ ๋ ํ๋๋ช ์ ๊ฐ์ ธ์์ ์ฃผ์ธ์ ์ง์ ํด์ค๋ค. ์ฌ๊ธฐ์ User ์ํฐํฐ์ team์ด ์ธ๋ํค๋ก ์ค์ ๋ ํ๋์ด๊ธฐ ๋๋ฌธ์ mappedBy = "team"์ผ๋ก ์ค์ ์ ํด์ค๋ค.
@ManyToOne์ ํญ์ ์ธ๋ํค๊ฐ ์ ์ฅ๋์ด ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ด ๋๊ธฐ ๋๋ฌธ์ mappedBy ์์ฑ์ ์ค์ ํ ์๋ ์๋ค.
๐ง๐ป๐ป์๋ฐฉํฅ ๋งคํ ์ ๋ฆฌ
- ํ ์ด๋ธ ์ฐ๊ด๊ด๊ณ์ ์ฃผ์ธ์ ๋ ํ ์ด๋ธ ์ค ์ธ๋ํค๋ฅผ ๊ด๋ฆฌํ๋ ์ชฝ์ ์ฃผ์ธ์ด๋ผ ํ๋ค.(๋ณดํต ์ธ๋ ํค๊ฐ ์ ์ฅ๋๋ ํ ์ด๋ธ)
- ์ฐ๊ด๊ด๊ณ ์ฃผ์ธ์ mappedBy์์ฑ์ ์ฌ์ฉํ์ง ์๋๋ค. ์ฃผ์ธ์ด ์๋ ๊ฒฝ์ฐ์๋ง mappedBy๋ก ์ฐ๊ด๊ด๊ณ ์ฃผ์ธ์ ์ง์ ํด์ฃผ์ด์ผ ํ๋ค.
- ์ฐ๊ด๊ด๊ณ ์ฃผ์ธ๋ง์ด DB ์ฐ๊ด๊ด๊ณ์ ๋งคํ๋๊ณ , ์ธ๋ํค๋ฅผ ๊ด๋ฆฌํ ์ ์๋ค.
- @ManyToOne์ ํญ์ ์ฐ๊ด๊ด๊ณ ์ฃผ์ธ์ด๋ค.
๐ง๐ป๐ป์์ ์ฝ๋ : https://github.com/ryudongjae/blog-ex
GitHub - ryudongjae/blog-ex: ๐๋ธ๋ก๊ทธ ์์ ์ฝ๋
๐๋ธ๋ก๊ทธ ์์ ์ฝ๋ . Contribute to ryudongjae/blog-ex development by creating an account on GitHub.
github.com
'Dev > SpringData' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [JPA] ๋ํฐ ์ฒดํน(Dirty Checking) (0) | 2021.12.22 |
|---|---|
| [JPA] N + 1 ์ด์ (0) | 2021.12.17 |
| [Querydsl] Projection ์ ๋ฆฌ (0) | 2021.12.12 |
| [Querydsl] QueryDSL ์ฌ์ฉ๋ฒ ์ ๋ฆฌ (0) | 2021.12.03 |
| [Spring] DTO ์ฌ์ฉ๋ฒ์์ ๋ํ์ฌ (0) | 2021.11.12 |