Skip to content

Latest commit

ย 

History

History
72 lines (49 loc) ยท 4.17 KB

File metadata and controls

72 lines (49 loc) ยท 4.17 KB

โœ๏ธ JPA

์ผ๋ฐ˜ JPA์™€ Spring Data JPA์˜ ์ฐจ์ด์ ์ด ๋ฌด์—‡์ธ๊ฐ€์š”?

๊ธฐ์กด JPA๋Š” EntityManager๋ฅผ ์ฃผ์ž…๋ฐ›์•„ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ, Spring Data JPA๋Š” JPA๋ฅผ ํ•œ๋‹จ๊ณ„ ๋” ์ถ”์ƒํ™” ์‹œํ‚จ Repository ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ JPA๋ฅผ Spring Data JPA์˜ Repository์˜ ๊ตฌํ˜„์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Hibernate๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

JPA์˜ ๊ตฌํ˜„์ฒด์ค‘ ํ•˜๋‚˜๋กœ SQL์„ ์ง์ ‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ Hibernate๊ฐ€ SQL์„ ์ง์ ‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•ด์„œ JDBC API๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ฉฐ, ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ JDBC API๊ฐ€ ๋™์ž‘ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

JPA ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ๋ณ€๊ฒฝ๊ฐ์ง€(Dirty Checking)์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

๋ณ€๊ฒฝ ๊ฐ์ง€๋ž€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ DB์— ๋ณด๋‚ด๊ธฐ ์ „ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ๋ณ€ํ™”๊ฐ€ ์žˆ์—ˆ๋Š”์ง€ ํ™•์ธ ํ•œ ํ›„ ๋ณ€ํ™”๊ฐ€ ์žˆ์—ˆ๋‹ค๋ฉด ์ˆ˜์ •์„ ํ•œ ํ›„ DB์— ๋ณด๋‚ด๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค.

transaction.commit ์ด ๋ฐœ์ƒํ•˜๋ฉด ์ž๋™์œผ๋กœ em.flush ๊ฐ€ ์ž‘๋™๋˜๋ฉฐ 1์ฐจ ์บ์‹œ์— ์ €์žฅ๋˜์—ˆ๋˜ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ DB๋กœ ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๋Š”๋ฐ, ๋“ค์–ด๊ฐ€๊ธฐ์ „์— 1์ฐจ ์บ์‹œ ์•ˆ ์—”ํ‹ฐํ‹ฐ์™€ ์Šค๋ƒ…์ƒท(๋งจ ์ฒ˜์Œ์— ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ๋“ค์–ด์˜จ ๊ฐ์ฒด ์ƒํƒœ)๋ฅผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ด ๋‘˜์ด ๋‹ค๋ฅด๋‹ค๋ฉด SQL ์ €์žฅ์†Œ์— update ์ฟผ๋ฆฌ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜๊ณ  commit์„ ํ•ฉ๋‹ˆ๋‹ค.

ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

๋™์‹œ์— ํŠธ๋žœ์žญ์…˜ ์ž‘์—…์ด ์ด๋ฃจ์–ด์งˆ ๋•Œ, A ํŠธ๋žœ์žญ์…˜์—์„œ B ํŠธ๋žœ์žญ์…˜์˜ ์กฐํšŒ์ค‘์ด๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ์ค‘์ธ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ํ—ˆ์šฉํ• ์ง€ ๋ง์ง€์— ๋Œ€ํ•œ ์ˆ˜์ค€์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

Read-Uncommited, Read-Committed, Repatable-Read, Serializable ๋„ค๊ฐ€์ง€ ์ˆ˜์ค€์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

  • Read-Uncommited: ๋‹ค๋ฅธ Transaction์—์„œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ปค๋ฐ‹๋˜์ง€ ์•Š์•˜๋”๋ผ๋„ ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Read-Commited: ํŠธ๋žœ์žญ์…˜์ด ์‹œ์ž‘๋˜๊ธฐ ์ „์— ์ปค๋ฐ‹๋œ ๋‚ด์šฉ๋งŒ ๋ฐ˜์˜๋œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด์„œ๋งŒ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด๋‹ค.
  • Repatable-Read: ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ์กฐํšŒํ•˜๋Š” ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ๊ณต์œ ๋ฝ์„ ๊ฑธ์–ด ์ž ๊ธˆ๋œ ๋ฐ์ดํ„ฐ์˜ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅ์ด ๋ณด์žฅ๋œ๋‹ค.
  • Serializable: ๊ฐ€์žฅ ๋‹จ์ˆœํ•˜๋ฉด์„œ ๊ฐ€์žฅ ์—„๊ฒฉํ•œ ๊ด€๋ฆฌ ์ˆ˜์ค€์ด๋‹ค. ****ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ์˜ Select๋œ ์ž์›๋“ค์€ ๊ณต์œ  ์ž ๊ธˆ๋œ๋‹ค
N+1 ๋ฌธ์ œ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

์—ฐ๊ด€ ๊ด€๊ณ„๊ฐ€ ์„ค์ •๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•  ๊ฒฝ์šฐ์— ์กฐํšŒ๋œ ๋ฐ์ดํ„ฐ ๊ฐฏ์ˆ˜(n) ๋งŒํผ ์—ฐ๊ด€๊ด€๊ณ„์˜ ์กฐํšŒ ์ฟผ๋ฆฌ๊ฐ€ ์ถ”๊ฐ€๋กœ ๋ฐœ์ƒํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ค๋Š” ํ˜„์ƒ์œผ๋กœ,1๋ฒˆ์˜ ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ ธ์„ ๋•Œ ์˜๋„ํ•˜์ง€ ์•Š์€ N๋ฒˆ์˜ ์ฟผ๋ฆฌ๊ฐ€ ์ถ”๊ฐ€์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

  EAGER(์ฆ‰์‹œ ๋กœ๋”ฉ)์ธ ๊ฒฝ์šฐ
    1. JPQL์—์„œ ๋งŒ๋“  SQL์„ ํ†ตํ•ด๋ฐ์ดํ„ฐ(1)๋ฅผ ์กฐํšŒ
    2. ์ดํ›„ JPA์—์„œ EAGER ์ „๋žต์„ ๊ฐ€์ง€๊ณ  ํ•ด๋‹น ๋ฐ์ดํ„ฐ์˜ ์—ฐ๊ด€ ๊ด€๊ณ„์ธํ•˜์œ„ ์—”ํ‹ฐํ‹ฐ๋“ค(N)์„ ์ถ”๊ฐ€ ์กฐํšŒ
    3. 2๋ฒˆ ๊ณผ์ •์œผ๋กœ N + 1 ๋ฌธ์ œ ๋ฐœ์ƒ

  LAZY(์ง€์—ฐ ๋กœ๋”ฉ)์ธ ๊ฒฝ์šฐ
    1. JPQL์—์„œ ๋งŒ๋“  SQL์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒ
    2. JPA์—์„œ Fetch ์ „๋žต์„ ๊ฐ€์ง€์ง€๋งŒ, ์ง€์—ฐ ๋กœ๋”ฉ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ถ”๊ฐ€ ์กฐํšŒ๋Š” ํ•˜์ง€ ์•Š์Œ
    3. ํ•˜์ง€๋งŒ, ํ•˜์œ„ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์ž‘์—…ํ•˜๊ฒŒ ๋˜๋ฉด ์ถ”๊ฐ€ ์กฐํšŒ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ตญ N + 1 ๋ฌธ์ œ ๋ฐœ์ƒ
์ง€์—ฐ ๋กœ๋”ฉ๊ณผ ์ฆ‰์‹œ ๋กœ๋”ฉ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

์ง€์—ฐ๋กœ๋”ฉ ์ ์šฉ ์‹œ DB๊ฐ€ ์•„๋‹Œ ํ”„๋ก์‹œ์—์„œ ๊ฐ€์ ธ์˜จ๋‹ค. ์ง€์—ฐ๋กœ๋”ฉ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด Member์™€ Team์ด ๊ฐ๊ฐ ๋ถ„๋ฆฌ๋˜์–ด Member๋Š” DB๋ฅผ ์กฐํšŒํ•˜๊ณ , Team์€ ํ”„๋ก์‹œ๋ฅผ ์กฐํšŒํ•œ๋‹ค.

์ฆ‰์‹œ๋กœ๋”ฉ์€ ์‹ค์ œ DB์—์„œ ํ•œ ๋ฐฉ์— ์กฐํšŒ fetch = FetchType.EAGER๋กœ ๋ฌถ์—ฌ์žˆ์„ ๊ฒฝ์šฐ Member๋งŒ ์กฐํšŒ๋ฅผ ํ•„์š”๋กœ ํ–ˆ์œผ๋‚˜, Team ์ •๋ณด๋„ ๊ฐ™์ด ๋‚˜์˜ค๊ธฐ ๋•Œ๋ฌธ ์ด๋ฌธ์ œ๊ฐ€ n + 1๋กœ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.


์ฐธ๊ณ  https://dev-coco.tistory.com/165

https://study-easy-coding.tistory.com/137