๋ฐ˜์‘ํ˜•
์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘

ํ…Œ์ด๋ธ”์„ ๊ธฐ์ค€์œผ๋กœ ํ•˜๋ฉด, ์™ธ๋ž˜ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ด๋ธ”๋ผ๋ฆฌ ์—ฐ๊ด€์„ ๋งบ๋Š”๊ฒƒ or ๊ฐ์ฒด๋ผ๋ฉด ์ฐธ์กฐ(์ฃผ์†Œ)์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๊ด€์„ ๋งบ๋Š”๊ฒƒ.

 

์—ฐ๊ด€๊ด€๊ณ„ ๋ฐฉํ–ฅ (Direction)

โ€ฃ ๋‹จ๋ฐ˜ํ–ฅ ์—ฐ๊ด€๊ด€๊ณ„
    → ํ•œ์ชฝ๋งŒ ์ฐธ์กฐํ•˜๋Š”๊ฒƒ
    → ๊ฐ์ฒด ๊ด€๊ณ„

โ€ฃ ์–‘๋ฐฉํ–ฅ ์—ฐ๊ด€๊ด€๊ณ„ 
    → ์„œ๋กœ ์ฐธ์กฐํ•˜๋Š”๊ฒƒ
    → mappedBy ์†์„ฑ ์‚ฌ์šฉ
    → ํ…Œ์ด๋ธ” ๋ผ๋ฆฌ ์—ฐ๊ด€๊ด€๊ณ„ ๋งบ๊ธฐ (์™ธ๋ž˜ํ‚ค ์ด์šฉ) = ์„œ๋กœ ๋‹ค๋ฅธ ๋‹จ๋ฐฉํ–ฅ ๊ด€๊ณ„ 2๊ฐœ

 

 

๋‹ค์ค‘์„ฑ (Multiplicity)

โ€ฃ ๋‹ค๋Œ€์ผ (N:1)
    → ๋‹จ๋ฐฉํ–ฅ, ์–‘๋ฐฉํ–ฅ
    → @ManyToOne ์œผ๋กœ ํ‘œํ˜„
    → N ์— ์™ธ๋ž˜ํ‚ค ์กด์žฌ = ์—ฐ๊ด€๊ด€๊ณ„ ์ฃผ์ธ
    → @ManyToOne ๊ธฐ๋ณธ ํŽ˜์น˜์ „๋žต: ์ฆ‰์‹œ๋กœ๋”ฉ (EAGER)


โ€ฃ ์ผ๋Œ€๋‹ค (1:N)
    → ๋‹จ๋ฐฉํ–ฅ(@JoinColumn ๋ช…์‹œ ํ•„์š”), ์–‘๋ฐฉํ–ฅ(=์กด์žฌํ•˜์ง€ ์•Š์Œ. ๋‹ค๋Œ€์ผ ์–‘๋ฐฉํ–ฅ ๋งคํ•‘์„ ์‚ฌ์šฉํ•ด์•ผํ•จ)
    → @OneToMay ์œผ๋กœ ํ‘œํ˜„
    → N ์— ์™ธ๋ž˜ํ‚ค ์กด์žฌ = ์—ฐ๊ด€๊ด€๊ณ„ ์ฃผ์ธ
    → @OneToMany ๊ธฐ๋ณธ ํŽ˜์น˜์ „๋žต: ์ง€์—ฐ๋กœ๋”ฉ (LAZY)
    → ์ผ๋Œ€๋‹ค ๋‹จ๋ฐฉํ–ฅ ๋งคํ•‘๋ณด๋‹จ, ๋‹ค๋Œ€์ผ ์–‘๋ฐฉํ–ฅ ๋งคํ•‘์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์ž! (์™ธ๋ž˜ํ‚ค ๊ด€๋ฆฌํ•˜๊ธฐ ํž˜๋“ค๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.)


โ€ฃ ์ผ๋Œ€์ผ (1:1)
    → ์ฃผํ…Œ์ด๋ธ” or ๋Œ€์ƒํ…Œ์ด๋ธ” ์—์„œ ์™ธ๋ž˜ํ‚ค ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ.
    → @OneToOne ์œผ๋กœ ํ‘œํ˜„
    → @OneToOne ๊ธฐ๋ณธ ํŽ˜์น˜์ „๋žต: ์ฆ‰์‹œ๋กœ๋”ฉ (EAGER)


โ€ฃ ๋‹ค๋Œ€๋‹ค (N:N)
    → ๋‹จ๋ฐฉํ–ฅ, ์–‘๋ฐฉํ–ฅ (๋‹ค๋Œ€๋‹ค ์–‘๋ฐฉํ–ฅ์€ ์ผ๋Œ€๋‹ค ์–‘๋ฐฉํ–ฅ๊ณผ ๊ฐ™์Œ)
    → @ManyToMany ์œผ๋กœ ํ‘œํ˜„
    → N:N ์‚ฌ์ด ์ค‘๊ฐ„ ํ…Œ์ด๋ธ”์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉ.
    → ์‹๋ณ„๊ด€๊ณ„์™€ ๋น„์‹๋ณ„๊ด€๊ณ„๊ฐ€ ์žˆ๋‹ค.
    → @ManyToMany ๊ธฐ๋ณธ ํŽ˜์น˜์ „๋žต: ์ง€์—ฐ๋กœ๋”ฉ (LAZY)

 

์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘ ๊ด€๋ จ ์–ด๋…ธํ…Œ์ด์…˜
@ManyToOne(optional="false ๋ฆฌ๋ฉด ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ํ•ญ์ƒ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๊ธฐ๋ณธ๊ฐ’: true", 
           fetch="๊ธ€๋กœ๋ฒŒ ํŽ˜์น˜ ์ „๋žต(EAGER, LAZY)", 
           cascade="์˜์†์„ฑ ์ „์ด ๊ธฐ๋Šฅ ์‚ฌ์šฉ", targetEntity="์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ์˜ ํƒ€์ž… ์ •๋ณด ์„ค์ •(๊ฑฐ์˜์‚ฌ์šฉ์•ˆํ•จ).")
           
           
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)

@ManyToOne(fetch = FetchType.LAZY)

@ManyToMany(mappedBy = "items")
@JoinColumn(name="๋งคํ•‘ํ•  ์™ธ๋ž˜ ํ‚ค ์ด๋ฆ„", 
            referencedColumnName="์™ธ๋ž˜ํ‚ค๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๋Œ€์ƒ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ๋ช…", 
            foreignKey="์™ธ๋ž˜ํ‚ค์ œ์•ฝ์กฐ๊ฑด์„ ์ง์ ‘ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ์†์„ฑ์€ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•  ๋•Œ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.")
/**
- ๊ทธ์™ธ์†์„ฑ
unique, nullable, insertable, updatable, columnDefinition, table..
*/
@JoinTable(name = "category_item",
        joinColumns = @JoinColumn(name = "category_id"),
        inverseJoinColumns = @JoinColumn(name="item_id")
)
// ๋ถ€๋ชจ ๊ฐ์ฒด์— ์„ค์ •
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) // ํ•œํ…Œ์ด๋ธ”์— ์ปฌ๋Ÿผ ๋‹ค ๋•Œ๋ ค๋ฐ•์Œ
@DiscriminatorColumn(name = "dtype") // ํ•˜์œ„ ์ž์‹ํ…Œ์ด๋ธ”๋“ค ํƒ€์ž…..

// ์ž์‹๊ฐ์ฒด์—๋‹ค๊ฐ€ ์„ค์ •
@DiscriminatorValue("A")
@Enumerated(EnumType.STRING)

@Embedded
@Id @GeneratedValue
@Column(name = "order_id")
private Long id;

 

 

 

์—ฐ๊ด€๊ด€๊ณ„ ์ฃผ์ธ (Owner) vs ์ฃผ์ธ์ด ์•„๋‹Œ์ชฝ

๊ฐ์ฒด๋ฅผ ์–‘๋ฐฉํ–ฅ(N:N)์—ฐ๊ด€๊ด€๊ณ„๋กœ ๋งŒ๋“ค ๊ฒฝ์šฐ, ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ์„ ์ •ํ•ด์•ผ ํ•œ๋‹ค. (=์ฐธ์กฐ๋Š” ๋‘˜, ์™ธ๋ž˜ํ‚ค๋Š” ํ•˜๋‚˜์ธ ๊ฒฝ์šฐ)


โ€ฃ ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ
    → ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์—ฐ๊ด€๊ด€๊ณ„์™€ ๋งคํ•‘๋˜๊ณ  ์™ธ๋ž˜ํ‚ค๋ฅผ ๊ด€๋ฆฌ(๋“ฑ๋ก,์ˆ˜์ •,์‚ญ์ œ)๋ฅผ ํ• ์ˆ˜์žˆ๋‹ค.
    → mappedBy ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
    → ์™ธ๋ž˜ํ‚ค ๊ด€๋ฆฌ์ž๋ฅผ ์„ ํƒ ํ•˜๋Š”๊ฒƒ์ด๋‹ค.
    → ์™ธ๋ž˜ํ‚ค์˜ ์œ„์น˜์™€ ๊ด€๋ จํ•ด์„œ ์ •ํ•ด์•ผํ•˜๊ณ , ๋น„์ง€๋‹ˆ์Šค ์ค‘์š”๋„๋กœ ์ ‘๊ทผํ•˜๋ฉด ์•ˆ๋จ
โ€ฃ ์ฃผ์ธ์ด ์•„๋‹Œ ์ชฝ
    → ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.
    → mappedBy ์†์„ฑ์„ ์‚ฌ์šฉ ํ•˜์—ฌ ์†์„ฑ์˜ ๊ฐ’์œผ๋กœ ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

ํ”„๋ก์‹œ

์—ฐ๊ด€๋œ ๊ฐ์ฒด๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์กฐํšŒํ•˜๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์‹ค์ œ ์‚ฌ์šฉํ•˜๋Š” ์‹œ์ ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Œ

ํ”„๋ก์‹œ ๊ฐ์ฒด

โ€ฃ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์กฐํšŒ๋ฅผ ์ง€์—ฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์งœ ๊ฐ์ฒด(์ง€์—ฐ๋กœ๋”ฉ์—์„œ ์‚ฌ์šฉ). ์‹ค์ œ ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ๋งŒ๋“ค์–ด์ ธ์žˆ์Œ.
โ€ฃ ์ง„์งœ๊ฐ์ฒด์ธ์ง€, ํ”„๋ก์‹œ ๊ฐ์ฒด์ธ์ง€ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉ ๊ฐ€๋Šฅ
โ€ฃ EntityManager.getReference(): ์กฐํšŒ๋ฅผ ๋ฏธ๋ฃจ๊ณ  ์‹ถ์„๋•Œ ์‚ฌ์šฉ. ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜
โ€ฃ ์ฒ˜์Œ ์‚ฌ์šฉํ• ๋•Œ ํ•œ๋ฒˆ๋งŒ ์ดˆ๊ธฐํ™” → ์ดˆ๊ธฐํ™”๋˜๋ฉด ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์‹ค์ œ ์—”ํ‹ฐํ‹ฐ์— ์ ‘๊ทผ ๊ฐ€๋Šฅ.
โ€ฃ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ฐพ๋Š” ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์ด๋ฏธ ์žˆ์œผ๋ฉด, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์กฐํšŒํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ
em.getReference()์„ ํ˜ธ์ถœํ•ด๋„ ํ”„๋ก์‹œ๊ฐ€ ์•„๋‹Œ ์‹ค์ œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•จ.

-



 

์ฆ‰์‹œ๋กœ๋”ฉ(FetchType.EAGER) ๊ณผ ์ง€์—ฐ๋กœ๋”ฉ(FetchType.LAZY) 

โ€ฃ ์ฆ‰์‹œ๋กœ๋”ฉ(FetchType.EAGER)
    → ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋„ ํ•จ๊ป˜ ์กฐํšŒ
    → ํ•˜์ด๋ฒ„๋„ค์ดํŠธ๋Š” ๊ฐ€๋Šฅํ•˜๋ฉด SQL ์กฐ์ธ์„ ์‚ฌ์šฉํ•ด์„œ ํ•œ ๋ฒˆ์— ์กฐํšŒ
    → ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ํ•˜๋‚˜๋ฉด ์ฆ‰์‹œ๋กœ๋”ฉ ์‚ฌ์šฉ


โ€ฃ ์ง€์—ฐ๋กœ๋”ฉ(FetchType.LAZY)
    → ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์‹ค์ œ ์‚ฌ์šฉํ•  ๋•Œ ์กฐํšŒ
    → ํ”„๋ก์‹œ๋ฅผ ์‹ค์ œ ์‚ฌ์šฉํ•  ๋•Œ ์ดˆ๊ธฐํ™”ํ•˜๋ฉด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์กฐํšŒ
    → ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์ปฌ๋ ‰์…˜์ด๋ฉด ์ง€์—ฐ๋กœ๋”ฉ ์‚ฌ์šฉ

โœฐ ์ง€์—ฐ๋กœ๋”ฉ์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์ž. (N+1๋ฌธ์ œ ๋ฐฉ์ง€)
โœฐ ์ปฌ๋ ‰์…˜์€ ํ•„๋“œ์—์„œ ๋ฐ”๋กœ ์ดˆ๊ธฐํ™”๋ฅผ ํ•˜๋„๋ก ํ•˜์ž. (ex. Apple apple = new Apple();)
โœฐ ๋งŒ์•ฝ ์—”ํ‹ฐํ‹ฐ์กฐํšŒ์‹œ, ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•ด์•ผํ•œ๋‹ค๋ฉด fetch join์„ ์‚ฌ์šฉํ•˜์ž. 

 


์ฐธ๊ณ 

- ์ฑ…: http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9788960777330 

 

์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ต๋ณด๋ฌธ๊ณ 

์Šคํ”„๋ง ๋ฐ์ดํ„ฐ ์˜ˆ์ œ ํ”„๋กœ์ ํŠธ๋กœ ๋ฐฐ์šฐ๋Š” ์ „์ž์ •๋ถ€ ํ‘œ์ค€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ”„๋ ˆ์ž„ | โ˜… ์ด ์ฑ…์—์„œ ๋‹ค๋ฃจ๋Š” ๋‚ด์šฉ โ˜…โ–  JPA ๊ธฐ์ดˆ ์ด๋ก ๊ณผ ํ•ต์‹ฌ ์›๋ฆฌโ–  JPA๋กœ ๋„๋ฉ”์ธ ๋ชจ๋ธ์„ ์„ค๊ณ„ํ•˜๋Š” ๊ณผ์ •์„ ์˜ˆ์ œ ์ค‘์‹ฌ์œผ๋กœ

www.kyobobook.co.kr


- ๋งํฌ: https://velog.io/@lsj8367/JPA-%ED%94%84%EB%A1%9D%EC%8B%9C

 

๋ฐ˜์‘ํ˜•

+ Recent posts