๋ฐ˜์‘ํ˜•
JPQL (Java Persistence Query Language)
์„ค๋ช…

ํ…Œ์ด๋ธ” ๋Œ€์ƒ์œผ๋กœ ํ•œ ์–ธ์–ด๊ฐ€ ์•„๋‹Œ, ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด ๋Œ€์ƒ์œผ๋กœ ์ฟผ๋ฆฌํ•œ ๊ฒƒ.
SQL์„ ์ถ”์ƒํ™”ํ•˜์—ฌ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค SQL์— ์˜์กดํ•˜์ง€ ์•Š์Œ.
JPQL → SQL ์œผ๋กœ ๋ณ€ํ™˜ํ•จ
๊ฐ์ฒด์ง€ํ–ฅSQL

 

ํŠน์ง•
-- ์ผ๋ฐ˜ SQL ๋ฌธ
select * from Member as m where m.username = 'coffee' -- ๋ณ„์นญ(m)์€ ํ•„์ˆ˜๋‹ค.

-- JPQL ๋ฌธ
/**
@Entity(name="memeber")
class Memeber {
  ...
  private String username;
}
*/
select m from memeber as m where m.username = 'coffee'
-- → ์—”ํ‹ฐํ‹ฐ๋ช…(member)์œผ๋กœ ์กฐํšŒํ•ด์•ผํ•œ๋‹ค.
-- → ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํด๋ž˜์Šค๋ช…(Member)์„ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. (ํด๋ž˜์Šค๋ช… ์ถ”์ฒœ)
-- → ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•œ๋‹ค.

select m.username from member as m 
-- → username ์„ ์กฐํšŒ ํ•œ๋‹ค๋ฉด, ๋ณ„์นญ(m)์€ ํ•„์ˆ˜๋กœ ์‚ฌ์šฉํ•ด์•ผํ•จ.

 

๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ›์„ ๋•Œ (createQuery ์‚ฌ์šฉ ์‹œ)

TypeQuery: ๋ฐ˜ํ™˜ํƒ€์ž…(๋ฉ”์†Œ๋“œ ๋ฆฌํ„ดํƒ€์ž…)์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ.
• Query: ๋ฐ˜ํ™˜ํƒ€์ž…(๋ฉ”์†Œ๋“œ ๋ฆฌํ„ดํƒ€์ž…)์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ง€์ •ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ.

 

๊ฒฐ๊ณผ ์กฐํšŒ API

query.getResultList(): ๊ฒฐ๊ณผ๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ์ผ๋•Œ ๋ฆฌ์ŠคํŠธ ๋ฐ˜ํ™˜
• query.getSingleResult(): ๊ฒฐ๊ณผ๊ฐ€ ์ •ํ™•ํžˆ ํ•˜๋‚˜, ๋‹จ์ผ ๊ฐ์ฒด ๋ฐ˜ํ™˜.

 

JPQL ์กฐ์ธ


 ๋‚ด๋ถ€ ์กฐ์ธ๊ณผ ์™ธ๋ถ€์กฐ์ธ

-- ๋‚ด๋ถ€ ์กฐ์ธ (INNER JOIN, INNER ์ƒ๋žต ๊ฐ€๋Šฅ)
select m from Member m inner join m.team t where t.name = :teamName


-- ์™ธ๋ถ€ ์กฐ์ธ (LEFT OUTER JOIN, OUTER ์ƒ๋žต ๊ฐ€๋Šฅ)
select m from Member m left join m.team t


-- ์„ธํƒ€์กฐ์ธ (์—ฐ๊ด€๊ด€๊ณ„ ์—†๋Š”๋ฐ ์กฐ์ธํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ!!)
select count(m) from Member m, Team t where m.username = t.name


์ปฌ๋ ‰์…˜ ์กฐ์ธ
  → ์ผ๋Œ€๋‹ค or ๋‹ค๋Œ€์ผ ๊ด€๊ณ„ ์ฒ˜๋Ÿผ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ณณ์— ์กฐ์ธํ•˜๋Š” ๊ฒƒ. 
  → ์ผ๋Œ€๋‹ค(=๋‹ค์˜ ์—ฐ๊ด€ํ•„๋“œ ์‚ฌ์šฉ) or ๋‹ค๋Œ€์ผ(=์ผ์˜ ์—ฐ๊ด€ํ•„๋“œ ์‚ฌ์šฉ)
 
์„ธํƒ€ ์กฐ์ธ
  → where ์ ˆ ์‚ฌ์šฉํ•˜์—ฌ ์กฐ์ธ (select count(m) from Memeber m, Team t where m.username = t.name)

• JOIN ON ์ ˆ (JPA 2.1 ๋ถ€ํ„ฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅ)
  → ์™ธ๋ถ€์กฐ์ธ์—์„œ๋งŒ ์‚ฌ์šฉ.

 ํŽ˜์น˜ ์กฐ์ธ (FETCH JOIN)
  → JPQL์—์„œ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ. ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋‚˜ ์ปฌ๋ ‰์…˜์„ ํ•œ๋ฒˆ์— ๊ฐ™์ด ์กฐํšŒํ•˜๋Š” ๊ธฐ๋Šฅ. join fetch ์œผ๋กœ ์‚ฌ์šฉ.
  → ํŽ˜์น˜์กฐ์ธ ์‚ฌ์šฉ์‹œ, SQL ํ•œ๋ฒˆ์œผ๋กœ ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋“ค์„ ํ•จ๊ป˜ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์–ด, SQL ์กฐํšŒ ํšŸ์ˆ˜๋ฅผ ์ค„์—ฌ ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
  → ์ง€์—ฐ๋กœ๋”ฉ ์‚ฌ์šฉ ๋ฐ  fetch join ์ ์šฉํ•˜๋Š”๊ฒƒ์ด ํšจ์œจ์ .
  ํŽ˜์น˜์กฐ์ธ์€ alias ์‚ฌ์šฉ์„ ๋ชปํ•˜๋ฉฐ, ๋‘˜ ์ด์ƒ์˜ ์ปฌ๋ ‰์…˜์„ ํŽ˜์น˜ํ•  ์ˆ˜ ์—†๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํŽ˜์ด์ง• API์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค...ํ—‰ 
  → ํŽ˜์น˜์กฐ์ธ์€ ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„ ์œ ์ง€ํ• ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ํšจ๊ณผ์ !
  → ํŠน์ • ๋ฐ์ดํ„ฐ๋งŒ ํ‘œํ˜„ํ•ด์•ผ ํ•œ๋‹ค๋ฉด ๊ตฌ์ง€ ํŽ˜์น˜ ์กฐ์ธ์„ ์‚ฌ์šฉํ•  ํ•„์š”๋Š” ์—†๋‹ค.

-- fetch join ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, m ๋ฐ m.team ๋ชจ๋‘ ์กฐํšŒ๋จ.
-- >> JPQL ์‹
select m from Member m join fetch m.team where m.name = 'AA'

-- >> SQL ์‹ 
select
  m.*, t.*
from Member m join Team t on m.team_id = t.id
where m.name = 'AA'




-- fetch join ์ด ์•„๋‹Œ ์ผ๋ฐ˜ join ์„ ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” SQL ์—์„œ ์ด๋ ‡๊ฒŒ ๋‚˜์˜ด
-- >> JPQL ์‹
select m from Member m join m.team

-- >> SQL ์‹ 
select
  m.*
from Member m join Team t on m.team_id = t.id

๋ฌต์‹œ์  ์กฐ์ธ
  → join ํ‚ค์›Œ๋“œ ์ง์ ‘ ์‚ฌ์šฉ (select ~~ from Member m join m.team t)
  → ์กฐ์ธ์ด ์ผ์–ด๋‚˜๋Š” ์ƒํ™ฉ,,์„ ํ•œ๋ˆˆ์— ์•Œ์•„๋ณด๊ธฐ ์–ด๋ ต๋‹ค,,?

๋ช…์‹œ์  ์กฐ์ธ (์ถ”์ฒœโญ๏ธ)
  → ๊ฒฝ๋กœ ํ‘œํ˜„์‹์— ์˜ํ•ด ๋ฌต์‹œ์ ์œผ๋กœ SQL ์กฐ์ธ ๋ฐœ์ƒ (๋‚ด๋ถ€ ์กฐ์ธ๋งŒ ๊ฐ€๋Šฅ) (select m.team from Member m)

 

 

์„œ๋ธŒ์ฟผ๋ฆฌ

where, having ์ ˆ์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, select, from ์ ˆ์—์„œ๋Š” ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ! (ใ… ใ… )
• EXISTS(๊ฒฐ๊ณผ ์กด์žฌ์‹œ ์ฐธ) → select ~~ where exsist (select t from ~~)
 ALL(๋ชจ๋‘ ๋งŒ์กฑ ์ฐธ) select ~~ where o.number > ALL (select b from ~~)
 ANY(์กฐ๊ฑด์ด ํ•˜๋‚˜๋ผ๋„ ๋งŒ์กฑ์‹œ ์ฐธ=SOME)  select ~~ where a.tesm = ANY(select c from ~~) 
 IN(์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๊ฐ™์€ ๊ฐ’์ด ์žˆ์œผ๋ฉด ์ฐธ) select ~~ where a.count in (select d from ~~)

 

CASE ์‹

COALESCE: ํ•˜๋‚˜์”ฉ ์กฐํšŒํ•ด์„œ null ์ด ์•„๋‹ˆ๋ฉด ๋ฐ˜ํ™˜
NULLIF: ๋‘ ๊ฐ’์ด ๊ฐ™์œผ๋ฉด null ๋ฐ˜ํ™˜, ๋‹ค๋ฅด๋ฉด ์ฒซ๋ฒˆ์งธ ๊ฐ’ ๋ฐ˜ํ™˜


์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜

select function('group_concat', name) from ~~
์‚ฌ์šฉ ์ „ group_concat์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์ •์˜๋ฅผ ํ•ด์•ผ ํ•จ. (DB๋ฐฉ์–ธ ์ƒ์† ๋ฐ›๊ณ , ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜ ๋“ฑ๋ก ํ•„์š”)

 

 


์ฐธ๊ณ 

- ์ฑ…: https://www.coupang.com/vp/products/20488571?itemId=80660090&vendorItemId=3314421212&src=1042503&spec=10304982&addtag=400&ctag=20488571&lptag=10304982I80660090&itime=20220302010946&pageType=PRODUCT&pageValue=20488571&wPcid=16461509863931582782572&wRef=&wTime=20220302010946&redirect=landing&gclid=CjwKCAiApfeQBhAUEiwA7K_UHxuELLbyb9IhdrRf5inlJZLtN8-t8cUswFHeV6fFp-Yd4RThtzZvHxoCPFsQAvD_BwE&campaignid=12207438463&adgroupid=115720946583&isAddedCart= 

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

ํ…Œ์ด๋ธ”์„ ๊ธฐ์ค€์œผ๋กœ ํ•˜๋ฉด, ์™ธ๋ž˜ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ด๋ธ”๋ผ๋ฆฌ ์—ฐ๊ด€์„ ๋งบ๋Š”๊ฒƒ 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

 

๋ฐ˜์‘ํ˜•
๋ฐ˜์‘ํ˜•
๋ณ€๊ฒฝ๊ฐ์ง€ (Dirty Checking)

โ€ฃ ๋ณ€๊ฒฝ๋œ ์—”ํ‹ฐํ‹ฐ ๋‚ด์šฉ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ž๋™์œผ๋กœ ๋ฐ˜์˜ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ.

 

em.save() ์„ ํ˜ธ์ถœํ•˜์ง€ ์•Š์•˜๋Š”๋ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ์ด ๋˜์—ˆ๋‹ค.

1. ๋ฐ์ดํ„ฐ ์ €์žฅ (๊ณผ๊ฑฐ๋‹‰๋„ค์ž„)

 

2. ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘, User entity ์„ ์กฐํšŒํ•˜๋‹ˆ username ์—๋Š” ๊ณผ๊ฑฐ๋‹‰๋„ค์ž„

 

3. setUsername๊ฑด์œผ๋กœ ๋ณ€๊ฒฝ  

 

4. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ˜์˜

โ€ฃ ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹ ํ›„, flush (๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋™๊ธฐํ™”) ํ•˜๋ฉด์„œ username ๋ณ€๊ฒฝ๋จ → ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ˜์˜ 

 


์ฐธ๊ณ 

- ๋งํฌ: https://cornarong.tistory.com/m/63

 

[JPA] ๋ณ€๊ฒฝ ๊ฐ์ง€(Dirty Checking) ์™€ ๋ณ‘ํ•ฉ(merge)

๋ณ€๊ฒฝ ๊ฐ์ง€(Dirty Checking) ์™€ ๋ณ‘ํ•ฉ( merge ) * ์ค€์˜์† ์ƒํƒœ? - ์˜์† ์ƒํƒœ์˜€๋‹ค๊ฐ€ ๋”๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š” ์ƒํƒœ - ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋กœ๋ถ€ํ„ฐ ๋ถ„๋ฆฌ๋œ ์ƒํƒœ * ์ค€์˜์† ์ƒํƒœ๋ฅผ ๋งŒ๋“œ๋Š” 3๊ฐ€์ง€ ๋ฐฉ

cornarong.tistory.com

 

๋ฐ˜์‘ํ˜•
๋ฐ˜์‘ํ˜•
JPA (Java Persistence API)

์ž๋ฐ” ์ง„์˜์—์„œ ๋งŒ๋“  ORM ๊ธฐ์ˆ  ํ‘œ์ค€

์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์ž๊ฐ€ SQL ์— ์˜์กดํ•˜๋Š” ๊ฐœ๋ฐœ์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„œ ์ฟผ๋ฆฌ๋ฌธ์„ ๋‹ค๋ฃจ์ง€ ์•Š๊ณ  ๊ฐ์ฒด์ง€ํ–ฅ ์ค‘์‹ฌ์œผ๋กœ ๊ฐœ๋ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋˜์–ด์žˆ๊ธฐ์—, ์ƒ์‚ฐ์„ฑ ๋ฐ ์œ ์ง€๋ณด์ˆ˜์— ํšจ์œจ์ 
๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• DB์˜ ์ฐจ์ด๋ฅผ ์ค‘๊ฐ„์—์„œ ํ•ด๊ฒฐํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ต์ฒดํ•˜๋”๋ผ๋„ ์œ ์ง€๋ณด์ˆ˜ ์˜ํ–ฅ๋„๊ฐ€ ํฌ์ง€ ์•Š์Œ.
    → mysql,, oracle ๋ฐ”๊ฟ” ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ์ฟผ๋ฆฌ ๋ณ€๊ฒฝ์—†์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ

 

JPA ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ

โ€ฃ ์—”ํ‹ฐํ‹ฐ ์™€ ํ…Œ์ด๋ธ”์„ ๋งคํ•‘ํ•˜๋Š” ์„ค๊ณ„ ๋ถ€๋ถ„
โ€ฃ ๋งคํ•‘ํ•œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์‹ค์ œ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„.

โœข ์—”ํ‹ฐํ‹ฐ ? 
์ •๋ณด๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋‹จ์œ„์ด๊ธฐ๋„ํ•˜๋ฉฐ
JPA ์—์„œ๋Š” ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์˜์†ํ™” ํ•ด์•ผํ•  ์ž๋ฐ” ๊ฐ์ฒด (๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”๋กœ ํ‘œํ˜„)๋ฅผ ๋‚˜ํƒ€๋ƒ„.

 

 

์˜์†์„ฑ ๊ด€๋ฆฌ

ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ƒ์„ฑ์ด ๋˜์—ˆ์ง€๋งŒ, ๋ณ„๊ฐœ๋กœ ์œ ์ง€๋˜๋Š” ์ƒํƒœ์˜ ํŠน์ง•์ค‘ ํ•˜๋‚˜.
์ด๋ฅผ ๋ณ„๋„์˜ ๊ธฐ์–ต์žฅ์น˜์— ๋ณด์กด ๋ฐ ๊ด€๋ฆฌํ•˜๋Š”๊ฒƒ.

https://www.youtube.com/watch?v=PMNSeD25Qko&list=PL9mhQYIlKEhfpMVndI23RwWTL9-VL-B7U&index=6

์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋Š” ํŠธ๋žœ์žญ์…˜์ด ์‹คํ–‰๋ ๋•Œ ์ปค๋„ฅ์…˜์„ ์–ป์Œ

์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ € ํŒฉํ† ๋ฆฌ
EntityManagerFactory emf = Persistence.createEntityManagerFactory("test");

โ€ฃ JPA ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒํ•จ.
โ€ฃ JPA ๋™์ž‘ ์œ„ํ•ด ๊ธฐ๋ฐ˜ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ์ปค๋„ฅ์…˜ํ’€์„ ์ƒ์„ฑํ•จ → ๋น„์šฉ์ด ํฌ๋‹ค.
โ€ฃ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋”ฑ ํ•œ๋ฒˆ ์ƒ์„ฑ ํ›„ ๊ณต์œ ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•จ.

 

์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €
EntityManager em = emf.createEntityManager();

โ€ฃ JPA ๊ธฐ๋Šฅ์„ ์ œ๊ณต. ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ CRUD๊ฐ€ ๊ฐ€๋Šฅํ•จ.
โ€ฃ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•จ. (๊ด€๋ฆฌ์ž)
โ€ฃ ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ•˜๊ธฐ ์ง์ „๊นŒ์ง€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๊ณ  ๋‚ด๋ถ€ ์ฟผ๋ฆฌ ์ €์žฅ์†Œ(์“ฐ๊ธฐ์ง€์—ฐ SQL ์ €์žฅ์†Œ)์— ์ฟผ๋ฆฌ๋ฅผ ๋ชจ์•„๋‘๋„๋ก ํ•จ.
    → ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹์‹œ ๋ชจ์•„๋‘” ์ฟผ๋ฆฌ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ณด๋ƒ„=ํ”Œ๋Ÿฌ์‹œ (์“ฐ๊ธฐ์ง€์—ฐ)
    → ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹๊นŒ์ง€ ๋˜์–ด์•ผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ณ€๊ฒฝ๋‚ด์šฉ ๋ฐ˜์˜์ด ๋จ
โ€ฃ ๋‚ด๋ถ€์— ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ (์ปค๋„ฅ์…˜ ์œ ์ง€) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ํ†ต์‹ ํ•จ.
โ€ฃ ๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Œ.
โ€ฃ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ปค๋„ฅ์…˜๊ณผ ๋ฐ€์ ‘ํ•œ ๊ด€๊ณ„๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์Šค๋ ˆ๋“œ๊ฐ„์— ๊ณต์œ ํ•˜๊ฑฐ๋‚˜ ์žฌ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋จ. (๋™์‹œ์„ฑ ๋ฌธ์ œ)
โ€ฃ ์ƒ์„ฑ ๋น„์šฉ์ด ํฌ์ง„ ์•Š์Œ.
โ€ฃ ์—”ํ‹ฐํ‹ฐ๋งค๋‹ˆ์ €๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋งˆ๋‹ค ์‹ค์ œ๋กœ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์™€ ์ƒํ˜ธ ์ž‘์šฉ์„ ํ•จ.

 

์˜์†์„ฑ ์ปจํ…์ŠคํŠธ (persistence context)

https://www.youtube.com/watch?v=PMNSeD25Qko&list=PL9mhQYIlKEhfpMVndI23RwWTL9-VL-B7U&index=6

โ€ฃ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜๊ตฌ ์ €์žฅํ•˜๋Š” ํ™˜๊ฒฝ 
โ€ฃ ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅ

โ€ฃ ์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €๋กœ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์กฐํšŒํ•˜๋ฉด ์—”ํ‹ฐํ‹ฐ๋งค๋‹ˆ์ €๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ณด๊ด€ํ•˜๊ณ  ๊ด€๋ฆฌ (์—”ํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €์˜ ์ˆ˜๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ)
โ€ฃ 1์ฐจ์บ์‹œ, ๋™์ผ์„ฑ๋ณด์žฅ(identity), ์“ฐ๊ธฐ์ง€์—ฐ, ๋ณ€๊ฒฝ๊ฐ์ง€(Dirty Checking), ์ง€์—ฐ๋กœ๋”ฉ(Lazy Loading) ๋จ

โœข 1์ฐจ ์บ์‹œ ? 
์˜์†์„ฑ ์ปจํ…์ŠคํŠธ ๋‚ด ์บ์‹œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ. 
์˜์†์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ๋Š” ๋ชจ๋‘ ์ด๊ณณ์— ์ €์žฅ๋จ.
Map ํ˜•ํƒœ์ด๊ณ  [key: @Id๋กœ ๋งคํ•‘ํ•œ ์‹๋ณ„์ž, value: ์—”ํ‹ฐํ‹ฐ ์ธ์Šคํ„ด์Šค] ์ด๋‹ค

 

์—”ํ‹ฐํ‹ฐ ์ƒ๋ช…์ฃผ๊ธฐ

https://www.youtube.com/watch?v=PMNSeD25Qko&list=PL9mhQYIlKEhfpMVndI23RwWTL9-VL-B7U&index=6

โ€ฃ ๋น„์˜์† (new/transient): ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์™€ ์ „ํ˜€ ๊ด€๊ณ„๊ฐ€ ์—†๋Š” ์ƒํƒœ
    → ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅํ•˜์ง€ ์•Š์€ ์ƒํƒœ.
    → ๊ฐ์ฒด๋งŒ ์ƒ์„ฑํ•œ ์ƒํƒœ 
โ€ฃ ์˜์† (managed): ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅ๋œ ์ƒํƒœ (์˜์†์ƒํƒœ)
โ€ฃ ์ค€์˜์† (detached): ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅ ๋˜์—ˆ๋‹ค๊ฐ€ ๋ถ„๋ฆฌ๋œ ์ƒํƒœ 
   → ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
   → 1์ฐจ ์บ์‹œ์—์„œ ์‚ฌ๋ผ์ง..
   → ์ง€์—ฐ๋กœ๋”ฉ(LAZY LOADING) ํ•  ์ˆ˜ ์—†๋‹ค.
   → ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
   → ์‹๋ณ„์ž๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ๊ฑฐ์˜ ๋น„์˜์† ์ƒํƒœ์ž„.
   → ๋‹ค์‹œ ์˜์† ์ƒํƒœ๋กœ ๋งŒ๋“œ๋ ค๋ฉด merge() ํ•˜๋ฉด ๋จ. (์ค€์˜์† ์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ฐ›์•„ ๋‹ค์‹œ ์˜์† ์ƒํƒœ๋กœ ๋งŒ๋“ฌ)
โ€ฃ ์‚ญ์ œ (removed): ์‚ญ์ œ 

 

์—”ํ‹ฐํ‹ฐ ์ €์žฅ (insert)

์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅํ•œ ์ƒํƒœ, ์•„์ง ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—๋Š” ์ €์žฅํ•˜์ง€ ์•Š์€ ์ƒํƒœ.

 

๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์ €์žฅ

โ€ฃ ์“ฐ๊ธฐ์ง€์—ฐ(transactional write-behind)
    → ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹ ์ง์ „๊นŒ์ง€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๊ณ ,
        ๋‚ด๋ถ€ ์ฟผ๋ฆฌ ์ €์žฅ์†Œ์— INSERT ์ฟผ๋ฆฌ๋ฅผ ๋ชจ์•„๋‘๊ณ  ์ปค๋ฐ‹์‹œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ณด๋‚ด๋Š” ์ƒํƒœ (๋ณด๋‚ด๋Š” ์ž‘์—…=flush)

 

์—”ํ‹ฐํ‹ฐ ์กฐํšŒ (read)

1์ฐจ ์บ์‹œ์—์„œ ์กฐํšŒํ•œ ์ƒํƒœ

โ€ฃ ๋™์ผ์„ฑ์ด ๋ณด์žฅ๋œ๋‹ค!

 

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์กฐํšŒํ•œ ์ƒํƒœ

 

๋ณ€๊ฒฝ ๊ฐ์ง€ (dirty checking) - ์ˆ˜์ •

โ€ฃ ์—”ํ‹ฐํ‹ฐ์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ž๋™์œผ๋กœ ๋ฐ˜์˜ํ•˜๋Š” ๊ธฐ๋Šฅ
โ€ฃ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•˜์—ฌ ๋ณ€๊ฒฝ๋ถ€๋ถ„ ํŒŒ์•… ํ›„ ์—…๋ฐ์ดํŠธ
โ€ฃ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์˜์† ์ƒํƒœ์˜ ์—”ํ‹ฐํ‹ฐ์—๋งŒ ์ ์šฉ
โ˜ž ๋ณ€๊ฒฝ ๊ฐ์ง€ ๊ด€๋ จ ์ƒํ™ฉ (๋งํฌ)

๋ณ€๊ฒฝ๊ฐ์ง€ ์ฒ˜๋ฆฌ์ƒํƒœ 

 

ํ”Œ๋Ÿฌ์‹œ (flush)

โ€ฃ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋™๊ธฐํ™”ํ•˜๋Š” ์ž‘์—…. 
    → ์ง์ ‘ ํ˜ธ์ถœ: em.flush() ์ง์ ‘ ํ˜ธ์ถœ
    → ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹ ์‹œ ํ”Œ๋Ÿฌ์‹œ ์ž๋™ ํ˜ธ์ถœ: ๊ธฐ๋ณธ์„ค์ •..
    → JPQL ์ฟผ๋ฆฌ ์‹คํ–‰์‹œ ํ”Œ๋Ÿฌ์‹œ ์ž๋™ ํ˜ธ์ถœ

 

 


์ฐธ๊ณ 

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

 

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

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

www.kyobobook.co.kr

- ๋งํฌ: https://ko.wikipedia.org/wiki/%EC%A7%80%EC%86%8D%EC%84%B1

- ๋งํฌ: https://www.baeldung.com/jpa-entities

 

์ง€์†์„ฑ - ์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „

 

ko.wikipedia.org

- ๋งํฌ: https://cupping.tistory.com/2

 

Programming language png Logo (transparent)

Jpa logo.png MariaDB logo.png ECMA6 logo.png python logo.png elasticSearch logo.png gradle logo.png node.js logo.png

cupping.tistory.com

- ๋งํฌ: https://openjpa.apache.org/builds/1.2.3/apache-openjpa/docs/jpa_overview_emfactory_perscontext.html

 

3.  Persistence Context

Example 7.1.  Behavior of Transaction Persistence Context The following code illustrates the behavior of entites under an EntityManager using a transaction persistence context. EntityManager em; // injected ... // outside a transaction: // each operation

openjpa.apache.org

- ๋งํฌ: https://www.baeldung.com/jpa-hibernate-persistence-context

- ๊ฐ•์˜: https://www.youtube.com/playlist?list=PL9mhQYIlKEhfpMVndI23RwWTL9-VL-B7U 

 

ํ† ํฌON 41์ฐจ. JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ณธ๊ธฐ ๋‹ค์ง€๊ธฐ | T์•„์นด๋ฐ๋ฏธ

T์•„์นด๋ฐ๋ฏธ ์˜จ๋ผ์ธ ๊ฐ•์˜- [ํ† ํฌON์„ธ๋ฏธ๋‚˜] JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ณธ๊ธฐ ๋‹ค์ง€๊ธฐ (์ด8๊ฐ•) https://tacademy.skplanet.com/live/player/onlineLectureDetail.action?seq=149 [๊ณผ์ • ์†Œ๊ฐœ] ๋งˆํ” ํ•œ๋ฒˆ์งธ ์„ธ๋ฏธ๋‚˜ ์ฃผ์ œ๋Š” ‘JPA(Java...

www.youtube.com

 

๋ฐ˜์‘ํ˜•

+ Recent posts