๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“— JPA

JPA ๊ฐœ๋… ์ •๋ฆฌ

by GroovyArea 2022. 7. 15.
JPA ์ฑ…์„ ์ด์ œ ๋ง‰ ๋‹ค ์ฝ์—ˆ๋‹ค.
ORM์„ ์ฒ˜์Œ ๊ณต๋ถ€ํ•œ๋‹ค๋Š” ์ƒ๊ฐ์— ๊ธด์žฅ์ด ๋งŽ์ด ๋์ง€๋งŒ, DB ๊ณต๋ถ€๋„ ํ•˜๊ณ , ๊ฐ์ฒด์ง€ํ–ฅ์— ๋Œ€ํ•œ ๊ณต๋ถ€๋ฅผ ์ถฉ๋ถ„ํžˆ ํ•œ ์ƒํƒœ์—ฌ์„œ ๊ทธ๋Ÿฐ์ง€ ์ƒ๊ฐ๋ณด๋‹ค ๊ธฐ์กด์— ์ฝ์—ˆ๋˜ real mysql, ํ† ๋น„์˜ ์Šคํ”„๋ง 3.1๋ณด๋‹ค ์ž˜ ์ฝํ˜”๋‹ค. 
๊ธฐ์กด์— database layer๋Š” Mybatis ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ด์šฉํ•ด ๊ตฌํ˜„ํ–ˆ์ง€๋งŒ, ์ด๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค. SQL ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.
์•ž์œผ๋กœ ํ•  ์ผ์ด ๋งŽ์ด ๋‚จ์•˜์œผ๋ฏ€๋กœ, JPA๋กœ์˜ ๋ฆฌํŒฉํ„ฐ๋ง์„ ์Šฌ์Šฌ ์‹œ์ž‘ํ•ด๋ณด์ž.

JPA

  • Java Persistence API
  • ์ž๋ฐ” ์ง„์˜์˜ ORM ํ‘œ์ค€ ๊ธฐ์ˆ 

ORM

  • Object Relational Mapping
  • ๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ๋งคํ•‘
  • ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

Hibernate

  • ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ORM ํ”„๋ ˆ์ž„์›Œํฌ
  • JPA ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ด Hibernate

 

JPA ํƒ„์ƒ ๋ฐฐ๊ฒฝ

JDBC๋ฅผ ์ด์šฉํ•œ ๊ฐœ๋ฐœ์€ ๊ฐ์ฒด ์ค‘์‹ฌ์ด ์•„๋‹Œ ๋ฐ์ดํ„ฐ๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๊ตฌ์กฐํ™”๋˜์–ด์žˆ๋‹ค.

๊ฐ์ฒด์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ํŒจ๋Ÿฌ๋‹ค์ž„ ๋ถˆ์ผ์น˜๋กœ ์ธํ•ด ์ƒ๋‹นํžˆ ๊ฐœ๋ฐœ ๊ณผ์ •์ด ๋ฒˆ๊ฑฐ๋กœ์šธ ์ˆ˜๋ฐ–์— ์—†๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด

  • ๋ฐ์ดํ„ฐ๋ฅผ ๋งคํ•‘ํ•  ๊ฐ์ฒด๋ฅผ ์ •์˜
  • ๋งคํผ ์ •์˜
  • SQL ์ž‘์„ฑ

์ด๋Ÿฌํ•œ SQL ์ค‘์‹ฌ์ ์ธ ๊ฐœ๋ฐœ์€ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ƒ๊ธธ ๊ฒฝ์šฐ ์ € ๊ณผ์ •์„ ๋ฌดํ•œ ๋ฐ˜๋ณตํ•œ๋‹ค.

๊ฐœ๋ฐœ์ž์ธ์ง€, SQL ๋งคํผ์ธ์ง€ ํ—ท๊ฐˆ๋ฆด ์ง€๊ฒฝ์ด๋‹ค. 

๋ณด๋‹ค ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ๊ฐœ๋ฐœ์— ์ง‘์ค‘ํ•˜๊ธฐ ์œ„ํ•ด ์ž๋ฐ” ์ง„์˜์€ JPA๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

 

JPA์˜ ๋™์ž‘

 

JPA ์žฅ์ 

1. ์ƒ์‚ฐ์„ฑ ๋ฐ ์œ ์ง€๋ณด์ˆ˜์— ์šฉ์ดํ•˜๋‹ค.

ํŠน์ • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ข…์†๋˜์ง€ ์•Š๊ณ , ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

2. ๋ฐ์ดํ„ฐ์™€ ๊ฐ์ฒด ๊ฐ„์˜ ํŒจ๋Ÿฌ๋‹ค์ž„ ๋ถˆ์ผ์น˜๊ฐ€ ํ•ด๊ฒฐ๋œ๋‹ค.

์ƒ์†๊ณผ ์—ฐ๊ด€๊ด€๊ณ„, ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ๋ฐ ๋น„๊ต์˜ ํŒจ๋Ÿฌ๋‹ค์ž„ ๋ถˆ์ผ์น˜๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค.

 

 

Entity Manager Factory & Entity Manager

Entity 

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ž๋ฃŒ ํ•œ๊ฑด์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ ˆ์ฝ”๋“œ

์œ , ๋ฌดํ˜•์˜ ์„œ๋กœ ๊ตฌ๋ณ„๋˜๋Š” ๊ฐ์ฒด

 

Entity Manager Factory 

  • Entity Manager๋ฅผ ์ƒ์„ฑ
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‹น ํ•œ ๊ฐœ๋ฅผ ์ƒ์„ฑ
  • Thread-safe ํ•˜๋‹ค.

Entity Manager

  • Entity๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ƒ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
  • Entity์˜ ์กฐํšŒ, ์ €์žฅ, ์ˆ˜์ •, ์‚ญ์ œ ๊ด€๋ จ ์ผ
  • ๋™์‹œ์„ฑ ๋ฌธ์ œ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, Spring์—์„œ๋Š” proxy๋กœ ๊ฐ์‹ธ Thread-safe๋ฅผ ๋ณด์žฅํ•œ๋‹ค.

 

PersistenceContext

  • Entity๋ฅผ ์˜๊ตฌํžˆ ์ €์žฅํ•˜๋Š” ํ™˜๊ฒฝ
  • Entity Manager๋ฅผ ์ด์šฉํ•ด Entity๋ฅผ ๋ณด๊ด€ํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค. 
  • Entity Manager ์ƒ์„ฑ ์‹œ ๊ฐ™์ด ๋งŒ๋“ค์–ด์ง

์žฅ์ 

  • Entity์˜ ๋™์ผ์„ฑ ๋ณด์žฅ
  • ๋ณ€๊ฒฝ ๊ฐ์ง€
  • ์ง€์—ฐ ๋กœ๋”ฉ
  • 1์ฐจ ์บ์‹œ ๊ธฐ๋Šฅ
  • ์“ฐ๊ธฐ ์ง€์—ฐ 

์ง€์—ฐ ๋กœ๋”ฉ๊ณผ ์ฆ‰์‹œ ๋กœ๋”ฉ

์ฆ‰์‹œ ๋กœ๋”ฉ

ํŠน์ • entity ์กฐํšŒ ์‹œ ์—ฐ๊ด€ entity๋ฅผ ๊ฐ™์ด ๋กœ๋”ฉํ•˜๋Š” ๊ฒƒ

์ˆ˜๋งŽ์€ ์กฐ์ธ์„ ํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ผ์œผํ‚ด

์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํŽธ

N+1 ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ด

 

์ง€์—ฐ ๋กœ๋”ฉ

์—ฐ๊ด€ entity๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๊ฐ€ ๋ผ์„œ์•ผ ์กฐํšŒ

ํ›จ์”ฌ ์ ์€ ๋กœ๋”ฉ ์‹œ๊ฐ„๊ณผ ์ ์€ ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„

 

 

N+1 ๋ฌธ์ œ

์—ฐ๊ด€ ๊ด€๊ณ„๊ฐ€ ์„ค์ •๋œ entity๋ฅผ ์กฐํšŒํ•  ๋•Œ ์กฐํšŒ๋œ ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜๋งŒํผ ์—ฐ๊ด€ ๊ด€๊ณ„์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ ์กฐํšŒ ์ฟผ๋ฆฌ๊ฐ€ ์ถ”๊ฐ€๋กœ ์‹คํ–‰๋œ๋‹ค. ์ด๋ฅผ N+1 ๋ฌธ์ œ์ด๋ฉฐ ์ฃผ๋กœ ์ฆ‰์‹œ ๋กœ๋”ฉ ์‹œ์— ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚จ๋‹ค.

 

JPQL ์ž…์žฅ์—์„œ ์—ฐ๊ด€๊ด€๊ณ„์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌด์‹œํ•˜๊ณ , Entity๋ฅผ ๊ธฐ์ค€์œผ๋กœ๋งŒ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, FetchType์œผ๋กœ ์ง€์ •ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

 

ํ•ด๊ฒฐ ๋ฐฉ์•ˆ

Fetch Join์œผ๋กœ ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•˜๋‹ค.

๋ฐ˜์‘ํ˜•