iseunghan 2021. 1. 19. 15:12
๋ฐ˜์‘ํ˜•

์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ์„ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

 

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

JPA๋ฅผ ์ฒ˜์Œ ์ ‘ํ•˜๊ฑฐ๋‚˜, ์‹ค๋ฌด์—์„œ JPA๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๊ธฐ๋ณธ ์ด๋ก ์ด ๋ถ€์กฑํ•˜์‹  ๋ถ„๋“ค์ด JPA์˜ ๊ธฐ๋ณธ ์ด๋ก ์„ ํƒ„ํƒ„ํ•˜๊ฒŒ ํ•™์Šตํ•ด์„œ ์ดˆ๋ณด์ž๋„ ์‹ค๋ฌด์—์„œ ์ž์‹ ์žˆ๊ฒŒ JPA๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธ‰ ์›น ๊ฐœ๋ฐœ ํ”„๋กœ๊ทธ๏ฟฝ

www.inflearn.com


๋ชฉ์ฐจ

  • ๊ฒฝ๋กœ ํ‘œํ˜„์‹
  • ํŽ˜์น˜ ์กฐ์ธ 1 - ๊ธฐ๋ณธ
  • ํŽ˜์น˜ ์กฐ์ธ 2 - ํ•œ๊ณ„
  • ๋‹คํ˜•์„ฑ ์ฟผ๋ฆฌ
  • ์—”ํ‹ฐํ‹ฐ ์ง์ ‘ ์‚ฌ์šฉ
  • Named ์ฟผ๋ฆฌ
  • ๋ฒŒํฌ ์—ฐ์‚ฐ

 


 

๊ฒฝ๋กœ ํ‘œํ˜„์‹ (์‹ค๋ฌด์—์„œ ์‚ฌ์šฉ ๊ถŒ์žฅ X)

( ๊ฒฝ๋กœ ํ‘œํ˜„์‹์œผ๋กœ ์ธํ•ด ๋ฌต์‹œ์ ์œผ๋กœ SQL ์กฐ์ธ(๋‚ด๋ถ€ ์กฐ์ธ) ๋ฐœ์ƒ) - ๋‚˜์ค‘์— ํฐ ํ˜ผ๋ž€์„ ์ค„ ์ˆ˜ ์žˆ์Œ.

๊ฒฝ๋กœ ํ‘œํ˜„์‹์ด๋ž€ ?

.(์ )์„ ์ฐ์–ด ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒƒ

Member member = new Member();
String name = member.username;	// *

 

์šฉ์–ด ์ •๋ฆฌ

  • ์ƒํƒœ ํ•„๋“œ(state field) : ๋‹จ์ˆœํžˆ ๊ฐ’์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ํ•„๋“œ (ex : m.username)
  • ์—ฐ๊ด€ ํ•„๋“œ(association field) : ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ์œ„ํ•œ ํ•„๋“œ
    • ๋‹จ์ผ ๊ฐ’ ์—ฐ๊ด€ ํ•„๋“œ : @ManyToOne, @OneToOne, ๋Œ€์ƒ์ด ์—”ํ‹ฐํ‹ฐ (ex : m.team)
    • ์ปฌ๋ ‰์…˜ ๊ฐ’ ์—ฐ๊ด€ ํ•„๋“œ : @OneToMany, @ManyToMany, ๋Œ€์ƒ์ด ์ปฌ๋ ‰์…˜ (ex : m.orders)
SELECT m.username -> ์ƒํƒœ ํ•„๋“œ
	FROM Member m
    	join m.team t 	-> ๋‹จ์ผ ๊ฐ’ ์—ฐ๊ด€ ํ•„๋“œ
        join m.orders o -> ์ปฌ๋ ‰์…˜ ๊ฐ’ ์—ฐ๊ด€ ํ•„๋“œ
WhERE t.name = 'ํŒ€A'

 

1. ์ƒํƒœ ํ•„๋“œ

๊ฒฝ๋กœ ํƒ์ƒ‰์˜ ๋ ์ง€์ . ๋” ์ด์ƒ์˜ ํƒ์ƒ‰์€ X ๋ถˆ๊ฐ€

์ƒํƒœ ํ•„๋“œ

select ๋ฅผ ๋‘ ๋ฒˆ ์กฐํšŒ ํ•ด์„œ m.username์„ ๊ฐ€์ ธ์™”๋‹ค.

์‹คํ–‰ ์ฟผ๋ฆฌ

 

2. ๋‹จ์ผ ๊ฐ’ ์—ฐ๊ด€ ๊ฒฝ๋กœ

๋ฌต์‹œ์  ๋‚ด๋ถ€ ์กฐ์ธ์ด ๋ฐœ์ƒ(์„ฑ๋Šฅ์— ํฐ ์ง€์žฅ์„ ์ค€๋‹ค), ํƒ์ƒ‰์€ m.team.name ์ด๋Ÿฐ ์‹์œผ๋กœ ๊ฐ€๋Šฅ. 

๋‹จ์ผ ๊ฐ’ ์—ฐ๊ด€ ๊ฒฝ๋กœ
์‹คํ–‰ ์ฟผ๋ฆฌ

from ์ ˆ์— ๋ณด๋ฉด, member๋ž‘ team์ด๋ž‘ ๋‚ด๋ถ€ ์กฐ์ธ์ด ๋ฐœ์ƒ! ํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

๊ฐ์ฒด ์ž…์žฅ์—์„œ๋Š” .(์ )์„ ์ด์šฉํ•ด ์ ‘๊ทผํ•˜๋ฉด ๋˜์ง€๋งŒ, DB์ž…์žฅ์—์„œ๋Š” join์„ ํ†ตํ•ด ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด๋‹ค. 

๋‚˜์ค‘์— ์‹ค๋ฌด์—์„œ ์„ฑ๋Šฅ ํŠœ๋‹ํ•˜๋Š”๋ฐ ์žˆ์–ด์„œ ์•„์ฃผ ์ง€๋Œ€ํ•œ ์˜ํ–ฅ์„ ์ฃผ๊ฒŒ ๋œ๋‹ค.

 

3. ์ปฌ๋ ‰์…˜ ๊ฐ’ ์—ฐ๊ด€ ๊ฒฝ๋กœ

๋ฌต์‹œ์  ๋‚ด๋ถ€ ์กฐ์ธ์ด ๋ฐœ์ƒํ•œ๋‹ค. ์ปฌ๋ ‰์…˜์€ ๋” ์ด์ƒ์˜ ํƒ์ƒ‰์€ ๋ถˆ๊ฐ€ X, ํ•œ ๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ์ ์€ t.members.size ์ปฌ๋ ‰์…˜์˜ ์‚ฌ์ด์ฆˆ ์ •๋„..

FROM ์ ˆ์— ๋ช…์‹œ์  ์กฐ์ธ์„ ํ†ตํ•ด ์–ป์€ ๋ณ„์นญ์œผ๋กœ ํƒ์ƒ‰ ๊ฐ€๋Šฅํ•จ. (์•„๋ž˜ ์ฝ”๋“œ ์ฐธ์กฐ)

์ปฌ๋ ‰์…˜ ๊ฐ’ ์—ฐ๊ด€ ๊ฒฝ๋กœ
์‹คํ–‰ ์ฟผ๋ฆฌ

 

FROM ์ ˆ์—์„œ ๋ช…์‹œ์  ์กฐ์ธ์„ ํ†ตํ•ด ์–ป์€ ๋ณ„์นญ์œผ๋กœ ์ƒํƒœ ํ•„๋“œ ๊ฒฝ๋กœ๋กœ ํƒ์ƒ‰ํ•˜๊ธฐ

FROM ๋ช…์‹œ์  ์กฐ์ธ
์‹คํ–‰ ์ฟผ๋ฆฌ

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ช…์‹œ์ ์œผ๋กœ ๋‚ด๋ถ€ ์กฐ์ธ(inner join)์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‚˜์ค‘์— ์ฟผ๋ฆฌ ํŠœ๋‹ํ•˜๊ธฐ๋„ ์‰ฝ๊ณ , ๋ฌต์‹œ์  ์กฐ์ธ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๋‚˜์ค‘์— ์šด์˜ํ•˜๋Š”๋ฐ ํฐ ์• ๋กœ์‚ฌํ•ญ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

 

๊ฒฐ๋ก ๋ฌต์‹œ์  ์กฐ์ธ์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง์ž.

๊ฒฝ๋กœ ํ‘œํ˜„์‹ ์˜ˆ์ œ

select o.member.team from Order o	-> O

select t.members from Team t		-> O

select t.members.username from Team t 	-> X

select m.username from Team t join t.members m -> O

JPQL -> SQL

1. ์ƒํƒœ ํ•„๋“œ ๊ฒฝ๋กœ ํƒ์ƒ‰

// JPQL
select m.username, m.age from Member m

// SQL
select m.username, m.age from Member m

 

2. ๋‹จ์ผ ๊ฐ’ ์—ฐ๊ด€ ๊ฒฝ๋กœ ํƒ์ƒ‰

// JPQL
select o.member from Order o

// SQL
select m.*
	from Orders o
    	inner join Member m on o.member_id = m.id

 

 

์ •๋ฆฌ

  • ๊ฐ€๊ธ‰์  ๋ฌต์‹œ์  ์กฐ์ธ ๋Œ€์‹ ์— ๋ช…์‹œ์  ์กฐ์ธ ์‚ฌ์šฉ
    • ๋ฌต์‹œ์  ์กฐ์ธ์€ ํ•ญ์ƒ ๋‚ด๋ถ€ ์กฐ์ธ๋ฐ–์— ์•ˆ๋œ๋‹ค.
  • ์กฐ์ธ์€ SQL ํŠœ๋‹์— ์ค‘์š” ํฌ์ธํŠธ์ด๋‹ค.
  • ๊ฒฝ๋กœ ํƒ์ƒ‰์€ ์ฃผ๋กœ SELECT, WHERE ์ ˆ์—์„œ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋ฌต์‹œ์  ์กฐ์ธ์œผ๋กœ ์ธํ•ด SQL์˜ FROM (JOIN) ์ ˆ์— ์˜ํ–ฅ์„ ์คŒ.
  • ๋ฌต์‹œ์  ์กฐ์ธ์€ ์กฐ์ธ์ด ์ผ์–ด๋‚˜๋Š” ์ƒํ™ฉ์„ ํ•œ๋ˆˆ์— ํŒŒ์•…ํ•˜๊ธฐ ํž˜๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ ๊ธˆ์ง€!

 

๋ฐ˜์‘ํ˜•