๐ŸŒ WEB/JPA

5. ์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๋‹ค์–‘ํ•œ ์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘

์• ์ •์“ฐ 2021. 5. 14. 15:02

์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘์‹œ ๊ณ ๋ ค์‚ฌํ•ญ 3๊ฐ€์ง€

1. ๋‹ค์ค‘์„ฑ

2. ๋‹จ๋ฐฉํ–ฅ, ์–‘๋ฐฉํ–ฅ

3. ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ

- ๊ฐ์ฒด ์–‘๋ฐฉํ–ฅ ๊ด€๊ณ„๋Š” ์ฐธ์กฐ๊ฐ€ 2๊ตฐ๋ฐ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‘˜์ค‘ ํ…Œ์ด๋ธ”์˜ ์™ธ๋ž˜ ํ‚ค๋ฅผ ๊ด€๋ฆฌํ•  ๊ณณ์„ ์ง€์ •ํ•ด์•ผํ•จ

- ์™ธ๋ž˜ ํ‚ค๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ฐธ์กฐ

- ์ฃผ์ธ์˜ ๋ฐ˜๋Œ€ํŽธ : ์™ธ๋ž˜ ํ‚ค์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Œ, ๋‹จ์ˆœ ์กฐํšŒ

 

๋‹ค๋Œ€์ผ[N:1]

๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•จ

๋‹จ๋ฐ˜ํ–ฅ

์•„๋ž˜์™€ ๊ฐ™์ด [N]์—์„œ ์™ธ๋ž˜ ํ‚ค๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  Team์„ ์กฐํšŒ ํ•˜๊ณ  ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. Team์— ์„œ๋Š” ์กฐํšŒํ•˜์ง€ ๋ชปํ•จ -> Team์—์„œ Member์„ ์กฐํšŒํ•˜๋Š”์ผ์ด ๋นˆ๋ฒˆํ•˜๋‹ค๊ณ  ํ•˜๋ฉด -> ์–‘๋ฐ˜ํ–ฅ ์œผ๋กœ ๋งคํ•‘ํ•ด์ฃผ๋Š”๊ฒŒ ์ข‹์Œ.

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

์–‘๋ฐ˜ํ–ฅ

๋‹จ๋ฐ˜ํ–ฅ์—์„œ TEAM์ด MEMBER๋ฅผ mapped by ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ MEMBER๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค. (์ฝ๊ธฐ ์ „์šฉ) 

์ผ๋Œ€๋‹ค[1:N]

1์ด ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ์ด๋‹ค.

 

๋‹จ๋ฐฉํ–ฅ

TEAM ์—์„œ ์™ธ๋ž˜ํ‚ค๋ฅผ ๊ด€๋ฆฌํ•˜๊ฒŒ ๋˜๋ฉด TEAM์— MEMBER๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ MEMBER ๋˜ํ•œ update๋ฅผ ํ•œ๋‹ค ์„ฑ๋Šฅ์ƒ ์ถ”์ฒœ ํ•˜์ง€ ์•Š๊ณ  ์‹ค์ œ ์‚ฌ์šฉํ•  ๋•Œ ์ฟผ๋ฆฌ์ถ”์ ์‹œ update๋ฌธ์„ ๋ณด๊ณ  ์˜๋ฌธ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.(์‹ค๋ฌด์—์„œ ์ˆ˜๋งŽ์€ ํ…Œ์ด๋ธ”์ด ์žˆ์„ ๋•Œ ์ข‹์ง€ ์•Š์Œ) 

 

์™œ Team ์€ MEMBER์˜ ์™ธ๋ž˜ํ‚ค๋ฅผ ๊ด€๋ฆฌํ•˜๊ฒŒ ๋ ๊นŒ? 

ํ…Œ์ด๋ธ” ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ์ƒ๊ฐํ•ด๋ณด๋ฉด TEAM ์—์„œ MEMBER์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค TEAM ๋กœ์šฐ ๋˜ํ•œ ์ƒ์„ฑ๋˜์–ด์•ผ ํ•œ๋‹ค. -> ์ž˜๋ชป๋œ ์„ค๊ณ„ 

์ด๊ธฐ ๋•Œ๋ฌธ์— MEMBER ํ…Œ์ด๋ธ”์˜ ์™ธ๋ž˜ํ‚ค๋ฅผ ๊ด€๋ฆฌํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ

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

์‚ฌ์šฉ๋ฒ• Team.java ์— ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. ๋‹จ๋ฐฉํ–ฅ์ด๋ฏ€๋กœ MEMBER์—๋Š” ์•„๋ฌด๊ฒƒ๋„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.

    @OneToMany
    @JoinColumn(name = "TEAM_ID")
    private List<Member> members = new ArrayList<>();

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

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

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

 

์–‘๋ฐ˜ํ–ฅ

๊ณต์‹์ ์œผ๋กœ ์กด์žฌํ•˜์ง€ ์•Š์Œ.

@JoinColumn(insert=false,updateable=false) -> ์ฝ๊ธฐ ์ „์šฉ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์–‘๋ฐฉํ–ฅ ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

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

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

@ManyToOne ์—์„œ๋Š” ์™œ mappedBy๊ฐ€ ์—†์„๊นŒ?

์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ์ด ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์˜ ์™ธ๋ž˜ ํ‚ค๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•ผ๋งค ๋งคํ•‘์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”๋ฐ ๊ณต์‹์ŠคํŒฉ์—์„œ ์˜คํžˆ๋ ค ํ˜ผ๋ž€์„ ์ค„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—†๋‹ค!

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

์ผ๋Œ€์ผ ๊ด€๊ณ„ ๋ฐ˜๋Œ€๋„ ์ผ๋Œ€์ผ

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

- ์™ธ๋ž˜ ํ‚ค์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์œ ๋‹ˆํฌ ์ œ์•ฝ์กฐ๊ฑด ์ถ”๊ฐ€ ๋˜์–ด์•ผ ํ•จ

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

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

- ๋‹ค๋Œ€์ผ ์—ฐ๊ด€๊ด€๊ณ„๋ž‘ ์œ ์‚ฌ

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

์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•œ๋‹ค. LOKCER์— MEMBER์„ ๋„ฃ์–ด๋„ ๋œ๋‹ค. (์„ ํƒ๊ฐ€๋Šฅ)

 

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

 

์–‘๋ฐ˜ํ–ฅ

๋‹ค๋Œ€์ผ ์–‘๋ฐฉํ–ฅ ๋งคํ•‘ ์ฒ˜๋Ÿผ ์™ธ๋ž˜ ํ‚ค๊ฐ€ ์žˆ๋Š” ๊ณณ์ด ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ์ด๋‹ค. ๋ฐ˜๋Œ€ํŽธ์€ ์•„๋ž˜์™€ ๊ฐ™์ด mappedBy ์ ์šฉ

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

	/////////////////////////////////////////

	@OneToOne(mappedBy="locker")
	private Member member;

 

๋Œ€์ƒ ํ…Œ์ด๋ธ”์— ์™ธ๋ž˜ ํ‚ค๊ฐ€ ์žˆ๋Š” ๋‹จ๋ฐฉํ–ฅ์ผ ๊ฒฝ์šฐ? ์ง€์›ํ•˜์ง€ ์•Š์Œ ํ•˜์ง€๋งŒ ์–‘๋ฐ˜ํ–ฅ์€ ์ง€์›ํ•œ๋‹ค.

๋Œ€์ƒ ํ…Œ์ด๋ธ”์— ์™ธ๋ž˜ ํ‚ค๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ์ด๊ณ  ์ „ํ†ต์ ์ธ DB ๊ฐœ๋ฐœ์ž๊ฐ€ ์„ ํ˜ธํ•œ๋‹ค. 

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

์–‘๋ฐ˜ํ–ฅ์ผ ๊ฒฝ์šฐ ์•„๋ž˜์™€ ๊ฐ™์ด ์ž์‹ ์˜ Entity์— ์žˆ๋Š” ์™ธ๋ž˜ํ‚ค๋Š” ์ž์‹ ์ด ์ง์ ‘ ๊ด€๋ฆฌ ํ•ด์•ผ ํ•œ๋‹ค.

 

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

 

 

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

์‹ค๋ฌด์—์„œ ์“ฐ๋ฉด ์•ˆ๋œ๋‹ค! -> ๋‹ค๋Œ€๋‹ค๋กœ ํ’€๋ฆฌ๋Š” ๊ฐ„๋‹จํ•œ๊ฒŒ ์—†๋‹ค.

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

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

ํŽธ๋ฆฌํ•ด๋ณด์ด์ง€๋งŒ ์—ฐ๊ฒฐ๋งŒ ํ•˜๊ณ  ๋๋‚˜์ง€ ์•Š๋Š”๋‹ค. ์ค‘๊ฐ„ํ…Œ์ด๋ธ”์— ๋‹ค๋ฅธ ์ •๋ณด๋ฅผ ๋„ฃ์„ ์ˆ˜ ์—†๋‹ค.

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

- @ManyToMany ์‚ฌ์šฉ

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

- ๋‹ค๋Œ€๋‹ค ๋งคํ•‘ : ๋‹จ๋ฐฉํ–ฅ, ์–‘๋ฐฉํ–ฅ ๊ฐ€๋Šฅ

 

์•„๋ž˜์™€ ๊ฐ™์ด ์ค‘๊ฐ„ํ…Œ์ด๋ธ”์„ ์ง€์ •ํ•ด์ฃผ๋ฉด MEMBER์™€ PRODUCT ํ…Œ์ด๋ธ”์— PK๋ฅผ ๊ฐ–๊ณ  ์žˆ๋Š” ํ…Œ์ด๋ธ”์ด ์ƒ์„ฑ๋œ๋‹ค.

	@ManyToMany
	@joinTable(name="MEMBER_PRODUCT")
	private List<Product> products = new ArrayList<>();
    
	// ์–‘๋ฐ˜ํ–ฅ์ผ ๊ฒฝ์šฐ
	@ManyToMany(mappedBy="products")
	private List<Member> members = new ArrayList<>();

 

 

 

๋ฐ˜์‘ํ˜•