์ปฌ๋ ์
JPA์์๋ ์๋ฐ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ Collection, List, Set, Map ์ปฌ๋ ์ ์ ์ง์ํ๊ณ ๋ค์ ๊ฒฝ์ฐ์ ์ด ์ปฌ๋ ์ ์ ์ฌ์ฉํ ์ ์๋ค.
- @OneToMany, @ManyToMany ๋ฅผ ์ฌ์ฉํด์ '์ผ๋๋ค' ํน์ '๋ค๋๋ค' ์ํฐํฐ ๊ด๊ณ๋ฅผ ๋งคํํ ๋.
- @ElementCollection์ ์ฌ์ฉํด์ ๊ฐ ํ์ ์ ํ๋ ์ด์ ๋ณด๊ดํ ๋
์ฐ์ ์๋ฐ ์ปฌ๋ ์ ์ธํฐํ์ด์ค์ ํน์ง์ ๊ฐ๋จํ ์ดํด๋ณด๊ณ ๊ฐ์.
์๋ฐ ์ปฌ๋ ์ ์ธํฐํ์ด์ค์ ํน์ง
- Collection : ์๋ฐ๊ฐ ์ ๊ณตํ๋ ์ต์์ ์ปฌ๋ ์ ์ด๋ค.
- List : ์์๊ฐ ์๊ณ , ์ค๋ณต์ ํ์ฉํ๋ค.
- Set : ์์๊ฐ ์๊ณ , ์ค๋ณต์ ํ์ฉํ์ง ์๋๋ค
- Map : Key, Value๋ก ๋์ด์์ผ๋ฉฐ ํค๋ ์ค๋ณต์ ๋ถํํ๋ค.
JPA์ ์ปฌ๋ ์
JPA ๋ช ์ธ์๋ ์๋ฐ ์ปฌ๋ ์ ์ธํฐํ์ด์ค์ ๋ํ ํน๋ณํ ์ธ๊ธ์ด ์๋ค. ๋ฐ๋ผ์ JPA ๊ตฌํ์ฒด์ ๋ฐ๋ผ์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ด ์กฐ๊ธ์ฉ ๋ค๋ฅผ ์ ์๋ค. ์ฌ๊ธฐ์๋ ํ์ด๋ฒ๋ค์ดํธ ๊ตฌํ์ฒด๋ฅผ ๊ธฐ์ค์ผ๋ก ์ด์ผ๊ธฐํ๋ค.
ํ์ด๋ฒ๋ค์ดํธ๋ ์ํฐํฐ๋ฅผ ์์ ์ํ๋ก ๋ง๋ค ๋, ์ปฌ๋ ์ ํ๋๋ฅผ ํ์ด๋ฒ๋ค์ดํธ์์ ์ค๋นํ ์ปฌ๋ ์ ์ผ๋ก ๊ฐ์ธ์ ์ฌ์ฉํ๋ค.
์ปฌ๋ ์ ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด์์ด๋ฉฐ, ์ด๋ฐ ํน์ง ๋๋ฌธ์ ์ปฌ๋ ์ ์ ์ฌ์ฉํ ๋ ๋ค์์ฒ๋ผ ์ฆ์ ์ด๊ธฐํํด์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
Collection<Member> members = new ArrayList<Member>();
์ปฌ๋ ์ ์ ์ข ๋ฅ์ ๋ฐ๋ผ ์ฌ์ฉ๋๋ ๋ํผ ํด๋์ค๊ฐ ๋ค๋ฅธ๋ฐ ์์๋ณด์.
์ปฌ๋ ์ ์ธํฐํ์ด์ค | ๋ด์ฅ ์ปฌ๋ ์ | ์ค๋ณต ํ์ฉ | ์์ ๋ณด๊ด |
Collection, List | PersistentBag | O | X |
Set | PersistentSet | X | X |
List + @OrderColumn | PersistentList | O | O |
Collection, List - PersistentBag
Collection, List ์ธํฐํ์ด์ค๋ ์ค๋ณต์ ํ์ฉํ๋ ์ปฌ๋ ์ ์ด๊ณ , PersistentBag์ ๋ํผ ์ปฌ๋ ์ ์ผ๋ก ์ฌ์ฉํ๋ค. ์ด ์ธํฐํ์ด์ค๋ ArrayList๋ก ์ด๊ธฐํํ์ฌ ์ฌ์ฉํ๋ฉด ๋๋ค.
contains() ํน์ remove() ๋ฑ์ ๊ฐ์ ์ํฐํฐ๋ฅผ ์ฐพ๊ฑฐ๋ ์ญ์ ํ ๋๋ equals() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
Collection, List๋ ์ํฐํฐ๋ฅผ ์ถ๊ฐํ ๋ ์ค๋ณต๋ ์ํฐํฐ๊ฐ ์๋์ง ๋น๊ตํ์ง ์๊ณ ๋จ์ํ ์ ์ฅํ๊ธฐ ๋๋ฌธ์, ์ํฐํฐ๋ฅผ ์ ์ฅํด๋ ์ง์ฐ ๋ก๋ฉ๋ ์ปฌ๋ ์ ์ ์ด๊ธฐํํ์ง ์์ผ๋ ์ฃผ์ํ์!
Set - PersistentSet
Set์ ์ค๋ณต์ ํ์ฉํ์ง ์๋ ์ปฌ๋ ์ ์ผ๋ก, ํ์ด๋ฒ๋ค์ดํธ์์๋ PersistentSet์ ์ปฌ๋ ์ ๋ํผ๋ก ์ฌ์ฉํ๋ค. ์ด ์ธํฐํ์ด์ค๋ HashSet์ผ๋ก ์ด๊ธฐํํ๋ฉด ๋๋ค. (๋ฐ๋์ HashSet์ผ ํ์๋ ์๊ณ ๋จ์ง ์์์ด๋ค.)
HashSet์ ์ค๋ณต์ ํ์ฉํ์ง ์์ผ๋ฏ๋ก, add() ๋ฉ์๋๋ก ๊ฐ์ฒด๋ฅผ ์ถ๊ฐํ ๋ ๋ง๋ค equals() ๋ฉ์๋๋ก ๊ฐ์ ๊ฐ์ฒด๊ฐ ์๋์ง ๋น๊ตํ๋ค. ๊ฐ์ ๊ฐ์ฒด๊ฐ ์๋ค๋ฉด ๊ฐ์ฒด๋ฅผ ์ถ๊ฐํ๊ณ , ์๋ค๋ฉด false๋ฅผ ๋ฐํํ๋ฉฐ ์ถ๊ฐํ์ง ์๋๋ค.
์ฐธ๊ณ ๋ก HashSet์ ํด์ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ฏ๋ก hashcode()๋ ํจ๊ป ์ฌ์ฉํด์ ๋น๊ตํ๋ค.
Set์ ์ํฐํฐ๋ฅผ ์ถ๊ฐํ ๋ ์ค๋ณต๋ ์ํฐํฐ๊ฐ ์๋์ง ๋น๊ตํด์ผ ํ๋ค. ๋ฐ๋ผ์ ์ํฐํฐ๋ฅผ ์ถ๊ฐํ ๋ ์ง์ฐ ๋ก๋ฉ๋ ์ปฌ๋ ์ ์ ์ด๊ธฐํํ๋ค.
List + @OrderColumn - PersistentList
JPA์์๋ List๋ ์์๋ฅผ ๋ณด์ฅํด์ฃผ์ง ์์๋ค. ๊ทธ๋ฌ๋ @OrderColumn์ ์ถ๊ฐํ๋ฉด ์์๊ฐ ์๋ ํน์ํ ์ปฌ๋ ์ ์ผ๋ก ์ธ์ํ๋ค. ์์๊ฐ ์๋ค๋ ์๋ฏธ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์ ๊ฐ์ ์ ์ฅํด์ ์กฐํํ ๋ ์ฌ์ฉํ๋ค๋ ์๋ฏธ์ด๋ค.
์ด ๊ฒฝ์ฐ ํ์ด๋ฒ๋ค์ดํธ๋ ๋ด๋ถ ์ปฌ๋ ์ ์ธ PersistentList๋ฅผ ์ฌ์ฉํ๋ค.
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
public class Member {
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
private String name;
@Embedded
private Address address;
@OneToMany(mappedBy = "member")
@OrderColumn(name = "ORDERS_ORDER_NUMBER")
private List<Order> orders = new ArrayList<>();
}
๋ค์๊ณผ ๊ฐ์ด @OrderColumn์ ์ถ๊ฐํด์ฃผ๋ฉด Order ํ ์ด๋ธ์ ๋ค์๊ณผ ๊ฐ์ด ์์ ์ปฌ๋ผ์ด ์๊ธด๋ค.
์์๋ 0๋ถํฐ ์์ํ๋ค.
@OrderColumn์ ์ฌ์ฉํด์ List์ ์์น ๊ฐ์ ๋ณด๊ดํ๋ฉด ํธ๋ฆฌํ ๊ฑฐ ๊ฐ์ง๋ง ๋จ์ ์ด ์ข ๋ง์ ์ค์ ๋ก๋ ์ ์ฌ์ฉํ์ง ์๋๋ค.
๋ฐ๋ผ์ @OrderColumn์ ๋งคํํ์ง ๋ง๊ณ ๊ฐ๋ฐ์๊ฐ ์ง์ ์์๊ฐ์ ๊ด๋ฆฌํ๊ฑฐ๋ ๋ค์์ ์ค๋ช ํ๋ @OrderBy๋ฅผ ์ฌ์ฉํ๊ธธ ๊ถ์ฅํ๋ค.
OrderColumn์ ๋จ์
- @OrderColumn์ ๋์ ์ํฐํฐ์์ ๋งคํํ๋ฏ๋ก, ์ฃผ์ธ ์ํฐํฐ๊ฐ ์์์ ๊ฐ์ ์ ์ ์๋ค. ๊ทธ๋์ ์ฃผ์ธ ์ํฐํฐ๋ฅผ INSERT ํ ๋๋ ์์์ ๊ฐ์ด ์ ์ฅ๋์ง ์๋๋ค. ๋์ ์ํฐํฐ์ ๊ฐ์ UPADTEํ๋ SQL์ด ์ถ๊ฐ๋ก ๋ฐ์ํ๋ค.
- List๋ฅผ ๋ณ๊ฒฝํ๋ฉด ์ฐ๊ด๋ ๋ง์ ์์น ๊ฐ์ ๋ณ๊ฒฝํด์ผ ํ๋ค. ์๋ฅผ ๋ค์ด Order์ด 4๊ฐ ์์์ ๋, ์ฒซ๋ฒ์งธ Order์ ์ญ์ ํ๋ฉด, Order2, Order3, Order4์ ์์๋ฅผ ๊ฐ๊ฐ ํ๋์ฉ ์ค์ด๋ UPDATE SQL์ด ์ด 3๋ฒ ๋ฐ์ํ๋ค.
- ์ค๊ฐ์ ์์ ๊ฐ์ด ์์ผ๋ฉด ์กฐํํ List์๋ null์ด ๋ณด๊ด๋๋ค. ๋ฐ๋ผ์ ์ปฌ๋ ์ ์ ์ํํ ๋ NFE๊ฐ ๋ฐ์ํ๋ค.
@OrderBy
์ฌ์ฉ๋ฒ์ ์๋ ํฌ์คํ ์ ์ฐธ๊ณ ํ์.
๐ Reference
[์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ]
'๐๏ธ Spring > JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JPA] ๋ฆฌ์ค๋ - ์ํฐํฐ์ ์๋ช ์ฃผ๊ธฐ์ ๋ฐ๋ฅธ ์ด๋ฒคํธ ์ฒ๋ฆฌ (3) | 2021.12.21 |
---|---|
[JPA] @Converter (0) | 2021.12.21 |
[JPA] @OrderBy - ๋ฆฌ์คํธ์ ์์ ์ง์ ํ๊ธฐ (0) | 2021.12.21 |
[JPA] OSIV ๋? (6) | 2021.12.20 |
[JPA] JPA์ ์ฑ๋ฅ ์ต์ ํ (0) | 2021.12.19 |