Spring/Spring JPA ๊ธฐ๋ณธ

[์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ] 5. ๋‹ค๋Œ€์ผ[N:1] / ์ผ๋Œ€๋‹ค[1:N] / ์ผ๋Œ€์ผ[1:1] / ๋‹ค๋Œ€๋‹ค[N:M]

hello_u 2023. 2. 27. 20:53

 

๋‹ค๋Œ€์ผ [N : 1] @ManyToOne ๋‹จ๋ฐฉํ–ฅ 

 

Member(N) : Team(1) ์€ ๋‹ค๋Œ€์ผ ๊ด€๊ณ„ 

 

ํ•œ์ชฝ์ด ๊ด€๊ณ„๋ฅผ ๋งบ์€ ์ชฝ์˜ ์—ฌ๋Ÿฌ ๊ฐ์ฒด๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์„ ์˜๋ฏธ 

 

ํ•˜๋‚˜์˜ ํŒ€(1)์€ ์—ฌ๋Ÿฌ ๋ฉค๋ฒ„(N)๋ฅผ ๊ฐ–๋Š”๋‹ค

 

 

Member.class

@ManyToOne
@JoinColumn(name = "team_id")
private Team team;

 

Many -> One

Member(N) -> Team(1)

 

name ์†์„ฑ์—๋Š” ๋งคํ•‘ํ•  ์™ธ๋ž˜ ํ‚ค ์ด๋ฆ„ ์ง€์ •ํ•œ๋‹ค. 

 

 

 

๋‹ค๋Œ€์ผ [N : 1] OneToMany ์–‘๋ฐฉํ–ฅ 

 

Team ๊ฐ์ฒด์—์„œ ๋ฐ˜๋Œ€์ชฝ Member ๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•œ  List members ๋ฅผ ์ƒ์„ฑํ•ด์ค€๋‹ค. 

 

์ด๋ ‡๊ฒŒ ์ƒ์„ฑํ•ด์ค˜๋„ ํ…Œ์ด๋ธ”์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค. 

 

@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();

 

mappedBy ์†์„ฑ์€ ์–‘๋ฐฉํ–ฅ ๋งคํ•‘์ผ ๋•Œ ์‚ฌ์šฉ , ์ฃผ์ธ์„ ์ง€์ •ํ•ด์ค€๋‹ค . 

 

์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ์€ ์™ธ๋ž˜ํ‚ค๋ฅผ ๊ฐ–๊ณ ์žˆ๋Š” Member.team ์ด ์ฃผ์ธ์ด ๊ด€๋ฆฌ๋ฅผ ํ•œ๋‹ค .

 

์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ๋งŒ์ด ์™ธ๋ž˜ํ‚ค๋ฅผ ๊ด€๋ฆฌ,๋“ฑ๋ก,์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋ฐ˜๋Œ€์ชฝ์€ ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค. 

 

 

 

 

์ผ๋Œ€๋‹ค [1:N] ๋‹จ๋ฐฉํ–ฅ 

 

๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š” ๋ชจ๋ธ์ด๋‹ค.

 

์ผ๋Œ€๋‹ค ๋‹จ๋ฐฉํ–ฅ์€ ์ผ๋Œ€๋‹ค(1:N)์—์„œ ์ผ(1)์ด ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ์ด๋‹ค.

 

Team(1) ์ด ์™ธ๋ž˜ํ‚ค๋ฅผ ๊ด€๋ฆฌ , ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ์ด ๋˜๋Š” ๋ชจ๋ธ 

 

๋‹จ์  

 

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

 

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

 

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

 

 

์ผ๋Œ€์ผ [1:1]

 

์™ธ๋ž˜ํ‚ค์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์œ ๋‹ˆํฌ(UNI) ์ œ์•ฝ์กฐ๊ฑด์ด ์ถ”๊ฐ€๋œ ๊ฒƒ 

 

์ผ๋Œ€์ผ ๊ด€๊ณ„๋Š” ๊ทธ ๋ฐ˜๋Œ€๋„ ์ผ๋Œ€์ผ ๊ด€๊ณ„์ด๋‹ค.

 

์™ธ๋ž˜ํ‚ค๋Š” ์ฃผ ํ…Œ์ด๋ธ”์ด๋‚˜ ๋Œ€์ƒ ํ…Œ์ด๋ธ” ์ค‘์— ์„ ํƒํ•˜๋ฉด ๋œ๋‹ค .

 

๋‘˜์ค‘์— ํ•œ๊ตฐ๋ฐ๋งŒ ๋„ฃ์œผ๋ฉด ๋œ๋‹ค . ์ƒ๊ด€์—†๋‹ค. 

 

cf) ์ฃผํ…Œ์ด๋ธ” : ์ฃผ๋กœ ์—‘์„ธ์Šคํ•˜๋Š” ํ…Œ์ด๋ธ”์„ ๋งํ•œ๋‹ค.

 

 

 

๋ฃฐ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ • :  Member ๋Š” Locker ๋ฅผ ํ•˜๋‚˜๋ฐ–์— ๊ฐ–์„ ์ˆ˜ ์—†๋‹ค . ๊ทธ ๋ฐ˜๋Œ€๋„ ๋™์ผํ•˜๋‹ค. 

 

@OneToOne
@JoinColumn(name = "locker_id")
private Locker locker;

 

์ฃผ ๊ฐ์ฒด๊ฐ€ ๋Œ€์ƒ ๊ฐ์ฒด์˜ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ง€๋Š” ๊ฒƒ์ฒ˜๋Ÿผ 

 

์ฃผ ํ…Œ์ด๋ธ”์— ์™ธ๋ž˜ํ‚ค๋ฅผ ๋‘๊ณ  ๋Œ€์ƒ ํ…Œ์ด๋ธ”์„ ์ฐพ๋Š”๋‹ค. 

 

์žฅ์  : ์ฃผํ…Œ์ด๋ธ”๋งŒ ์กฐํšŒํ•ด๋„ ๋Œ€์ƒ ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

๋‹จ์  : ๊ฐ’์ด ์—†์œผ๋ฉด ์™ธ๋ž˜ํ‚ค์— null์ด ํ—ˆ์šฉ

 

 

 

 

๋‹ค๋Œ€๋‹ค [N:M]

 

๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

 

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

 

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

 

 

๊ฐ์ฒด

 

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

 

Member ๋Š” Product ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ–์„ ์ˆ˜ ์žˆ๊ณ 

 

๋ฐ˜๋Œ€๋กœ Product ๋„ Member ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ–์„ ์ˆ˜ ์žˆ๋‹ค. 

 

@ManyToMany
@JoinTable(name = "member_product")
private List<Product> products = new ArrayList<>();

 

@ManyToMany ๋ฅผ ์‚ฌ์šฉํ•จ

 

@JoinTable๋กœ ์—ฐ๊ฒฐ ํ…Œ์ด๋ธ”์„ ์ง€์ •ํ•œ๋‹ค .

 

 

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

 

ํŽธ๋ฆฌํ•ด ๋ณด์ด์ง€๋งŒ ์‹ค๋ฌด์—์„œ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋œ๋‹ค . 

 

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

 

์ฃผ๋ฌธ์‹œ๊ฐ„,์ˆ˜๋Ÿ‰ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

์—ฐ๊ฒฐํ…Œ์ด๋ธ”์„ ์—”ํ‹ฐํ‹ฐ๋กœ ๋งŒ๋“ค๊ณ  @OneToMany , @ManyToOne ์„ ์‚ฌ์šฉํ•˜์ž ! 

 

 

 

 

 

 

https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

 

์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜

JPA๋ฅผ ์ฒ˜์Œ ์ ‘ํ•˜๊ฑฐ๋‚˜, ์‹ค๋ฌด์—์„œ JPA๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๊ธฐ๋ณธ ์ด๋ก ์ด ๋ถ€์กฑํ•˜์‹  ๋ถ„๋“ค์ด JPA์˜ ๊ธฐ๋ณธ ์ด๋ก ์„ ํƒ„ํƒ„ํ•˜๊ฒŒ ํ•™์Šตํ•ด์„œ ์ดˆ๋ณด์ž๋„ ์‹ค๋ฌด์—์„œ ์ž์‹ ์žˆ๊ฒŒ JPA๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., - ๊ฐ•์˜ ์†Œ๊ฐœ | ์ธํ”„๋Ÿฐ

www.inflearn.com