๐Ÿ๏ธ Spring/JPA

[JPA] JPA๊ฐ€ ์ง€์›ํ•˜๋Š” ์ปฌ๋ ‰์…˜

๋ง ๋ž‘ 2021. 12. 21. 11:33
728x90

์ปฌ๋ ‰์…˜

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

์‚ฌ์šฉ๋ฒ•์€ ์•„๋ž˜ ํฌ์ŠคํŒ…์„ ์ฐธ๊ณ ํ•˜์ž.

 

[JPA] @OrderBy - ๋ฆฌ์ŠคํŠธ์— ์ˆœ์„œ ์ง€์ •ํ•˜๊ธฐ

@OrderBy @OrderColum์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ˆœ์„œ์šฉ ์ปฌ๋Ÿผ์„ ๋งคํ•‘ํ•ด์„œ ๊ด€๋ฆฌํ–ˆ๋‹ค๋ฉด, @OrderBy๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ORDER BY ์ ˆ์„ ์‚ฌ์šฉํ•ด์„œ ์ปฌ๋ ‰์…˜์„ ์ •๋ ฌํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ˆœ์„œ์šฉ ์ปฌ๋Ÿผ์„ ๋งคํ•‘ํ•  ํ•„์š”๋„ ์—†๊ณ , ๋˜ํ•œ @Orde

ttl-blog.tistory.com

 

 

 

๐Ÿ“” Reference

[์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ]

728x90