๐Ÿ’พ Database

[JPA] ๋‹ค์–‘ํ•œ ์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘(๋‹ค๋Œ€์ผ, ์ผ๋Œ€์ผ, ๋‹ค๋Œ€๋‹ค)

์—ฐ_์šฐ๋ฆฌ 2022. 2. 21. 16:23
๋ฐ˜์‘ํ˜•

๋ชฉ์ฐจ

     

     

    ๋‹ค๋Œ€์ผ / N:1 / @ManyToOne / N์ด ์ฃผ์ธ์ธ ๊ฒฝ์šฐ

    ์™ธ๋ž˜ํ‚ค๊ฐ€ ์žˆ๋Š” ์ชฝ์ด ์ฃผ์ธ

    N์ด ์ฃผ์ธ : @ManyToOne, @JoinColumn(name = "~")

    (์–‘๋ฐฉํ–ฅ์ธ ๊ฒฝ์šฐ) 1์ด ์„œ๋ธŒ : @OneToMany(mappedBy = "~")

     

     

     

    ์ผ๋Œ€๋‹ค / 1:N / @OneToMany / 1์ด ์ฃผ์ธ์ธ ๊ฒฝ์šฐ

    ์™ธ๋ž˜ํ‚ค๊ฐ€ ์žˆ๋Š” ์ชฝ์ด ์ฃผ์ธ...์ด์–ด์•ผํ•˜๋Š”๋ฐ

    ๊ฐ์ฒด์™€ ํ…Œ์ด๋ธ”์˜ ์ฐจ์ด ๋•Œ๋ฌธ์— ๋ฐ˜๋Œ€ํŽธ ํ…Œ์ด๋ธ”์˜ ์™ธ๋ž˜ํ‚ค๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ํŠน์ดํ•œ ๊ตฌ์กฐ

    1์ด ์ฃผ์ธ : @OneToMany, @JoinColumn(name = "~")

    (์–‘๋ฐฉํ–ฅ์ธ ๊ฒฝ์šฐ) N์ด ์„œ๋ธŒ : @ManyToOne, @JoinColumn(name = "~", insertable = false, updatable = false) (์‚ฌ์šฉํ•˜์ง€๋ง์ž)

     

    ๋‹จ์ ! 

     - ์—”ํ‹ฐํ‹ฐ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์™ธ๋ž˜ ํ‚ค๊ฐ€ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์— ์žˆ๋‹ค.

     - ์—ฐ๊ด€๊ด€๊ณ„ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์ถ”๊ฐ€๋กœ Update SQL์ด ์‹คํ–‰๋œ๋‹ค.

        ( team.getMembers().add(member) => Memberํ…Œ์ด๋ธ”์˜ team_id๋ฅผ ์ˆ˜์ •ํ•ด์ฃผ์–ด์•ผํ•จ.. )

     - ์ผ๋Œ€๋‹ค ๋‹จ๋ฐฉํ–ฅ๋งคํ•‘๋ณด๋‹ค ๋‹ค๋Œ€์ผ ์–‘๋ฐฉํ–ฅ๋งคํ•‘์„ ์‚ฌ์šฉํ•˜์ž

     

     

     

    ์ผ๋Œ€์ผ / 1:1 / @OneToOne / ์ฃผ์ธ ์„ ํƒ ๊ฐ€๋Šฅ

    ์ฃผ ํ…Œ์ด๋ธ”, ๋Œ€์ƒ ํ…Œ์ด๋ธ” ์ค‘ ์•„๋ฌด๊ฑฐ๋‚˜ ์ฃผ์ธ์œผ๋กœ ์„ ํƒํ•ด๋„ ์ƒ๊ด€์—†๋‹ค.

    ์™ธ๋ž˜ํ‚ค์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค UNIQUE ์ œ์•ฝ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•˜์ž.

     

    ์™ธ๋ž˜ํ‚ค๊ฐ€ ์žˆ๋Š” ์ชฝ์ด ์ฃผ์ธ

    ์ฃผ์ธ : @OneToOne, @JoinColumn(name = "~")

    (์–‘๋ฐฉํ–ฅ์ธ ๊ฒฝ์šฐ) ์„œ๋ธŒ : @OneToOne(mappedBy = "~")

     

    ์ฐธ๊ณ !

    Memberํ…Œ์ด๋ธ”์— locker_id๋ฅผ ์ถ”๊ฐ€ํ•ด๋„, Lockerํ…Œ์ด๋ธ”์— member_id๋ฅผ ์ถ”๊ฐ€ํ•ด๋„ ์ƒ๊ด€์—†์ด 1๋Œ€1 ๊ด€๊ณ„๋Š” ์„ฑ๋ฆฝํ•œ๋‹ค.

    ํ˜„์žฌ๋Š” Member๊ฐ€ 1๊ฐœ์˜ Locker๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‚˜์ค‘์— Member๊ฐ€ N๊ฐœ์˜ Locker๋ฅผ ๊ฐ€์ง€๊ฒŒ๋œ๋‹ค๋ฉด??

    => ์ด๋•Œ๋Š” Unique์ œ์•ฝ์กฐ๊ฑด ํ•˜๋‚˜๋งŒ ๋นผ๋ฉด ์„ฑ๋ฆฝํ•  ์ˆ˜ ์žˆ๊ฒŒ Locker์— member_id๊ฐ€ ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. (๋Œ€์ƒ ํ…Œ์ด๋ธ”์— ์™ธ๋ž˜ํ‚ค ์กด์žฌ)

     

    ํ•˜์ง€๋งŒ ๊ฐ์ฒด ์ž…์žฅ์—์„œ๋Š” Member์•ˆ์— Locker๊ฐ€ ์žˆ๋Š” ํŽธ์ด, getLockerํ•ด์„œ ๋กœ์ง ๊ตฌ์„ฑํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฝ๋‹ค. (์ฃผ ํ…Œ์ด๋ธ”์— ์™ธ๋ž˜ํ‚ค ์กด์žฌ)

    ์–ด๋””๋ฅผ "์ฃผ"๋กœ ํ•˜๊ณ  ์–ด๋””์— "์™ธ๋ž˜ํ‚ค"๋ฅผ ๋„ฃ์„์ง€ ๊ฒฐ์ •์€ ๊ฐ์ž์˜ ๋ชซ์ด๋‹ค!

     

     

     

    ๋‹ค๋Œ€๋‹ค / N:M / @ManyToMany / ์‚ฌ์šฉํ•˜์ง€๋ง์ž...

    ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ •๊ทœํ™”๋œ ํ…Œ์ด๋ธ” 2๊ฐœ๋กœ ๋‹ค๋Œ€๋‹ค ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†๋‹ค

     

    ํ•˜์ง€๋งŒ ๊ฐ์ฒด๋Š” ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•ด์„œ ๋‹ค๋Œ€๋‹ค ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค

    ๋‘˜์ค‘์— ํ•˜๋‚˜ ์„ ํƒํ•ด์„œ ์ฃผ์ธ์œผ๋กœ ๋งŒ๋“ ๋‹ค.

    ์ฃผ์ธ : @ManyToMany, @JoinTable(name = "~")

    (์–‘๋ฐฉํ–ฅ์ธ ๊ฒฝ์šฐ) ์„œ๋ธŒ : @ManyToMany(mappedBy = "~")

    @JoinTable(name = "category_item",
            joinColumns = @JoinColumn(name="category_id"),
            inverseJoinColumns = @JoinColumn(name="item_id")
    )

     

    ๋‹ค๋Œ€๋‹ค ๋งคํ•‘์˜ ํ•œ๊ณ„

     - ์—ฐ๊ฒฐ ํ…Œ์ด๋ธ”์ด ๋‹จ์ˆœํžˆ ์—ฐ๊ฒฐ๋งŒ ํ•˜๊ณ  ๋๋‚˜์ง€ ์•Š๋Š”๋‹ค. 

        ํšŒ์›๊ณผ ์ƒํ’ˆ์ธ ๊ฒฝ์šฐ ์ƒํ’ˆ์„ ์ฃผ๋ฌธํ•˜๊ฒŒ๋˜๋ฉด ์ˆ˜๋Ÿ‰๋„ ํ•„์š”ํ•˜๊ณ , ์–ธ์ œ ์ฃผ๋ฌธํ–ˆ๋Š”์ง€๋„ ์ •๋ณด๋กœ ์žˆ์–ด์•ผํ•œ๋‹ค.

        ํšŒ์›_์ƒํ’ˆ ํ…Œ์ด๋ธ”์—๋Š” ์ฃผ๋ฌธ์‹œ๊ฐ„, ์ˆ˜๋Ÿ‰ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋” ์ถ”๊ฐ€๋  ์ˆ˜ ์žˆ๋‹ค

     - ๊ฐ์ฒด๋Š” 2๊ฐœ์ง€๋งŒ ํ…Œ์ด๋ธ”์€ ์—ฐ๊ฒฐํ…Œ์ด๋ธ”๊นŒ์ง€ 3๊ฐœ์ด๋‹ค. 

        ๊ฐ์ฒด๋กœ๋Š” ๋ณด์ด์ง€ ์•Š๋Š” ์—ฐ๊ฒฐ ํ…Œ์ด๋ธ”์ด ์ค‘๊ฐ„์— ์ˆจ์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜์ง€ ๋ชปํ•œ ์ฟผ๋ฆฌ๊ฐ€ ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

        ์ฐจ๋ผ๋ฆฌ ์—ฐ๊ฒฐ ํ…Œ์ด๋ธ”์„ ์—”ํ‹ฐํ‹ฐ๋กœ ์Šน๊ฒฉ์‹œ์ผœ์„œ ๋ˆˆ์— ๋ณด์ด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

     

     

    โญ์—ฐ๊ฒฐ ํ…Œ์ด๋ธ”์„ ์ถ”๊ฐ€ํ•ด์„œ ์ผ๋Œ€๋‹ค, ๋‹ค๋Œ€์ผ ๊ด€๊ณ„๋กœ ํ’€์–ด๋‚ด์•ผํ•œ๋‹ค.

     

     

     

    ๋ฐ˜์‘ํ˜•
    • ๋„ค์ด๋ฒ„ ๋ธ”๋Ÿฌ๊ทธ ๊ณต์œ ํ•˜๊ธฐ
    • ํŽ˜์ด์Šค๋ถ ๊ณต์œ ํ•˜๊ธฐ
    • ํŠธ์œ„ํ„ฐ ๊ณต์œ ํ•˜๊ธฐ
    • ๊ตฌ๊ธ€ ํ”Œ๋Ÿฌ์Šค ๊ณต์œ ํ•˜๊ธฐ
    • ์นด์นด์˜คํ†ก ๊ณต์œ ํ•˜๊ธฐ