JPA(Java Persistence API)

JOY🌱·2023λ…„ 4μ›” 6일
0

🐸 JPA

λͺ©λ‘ 보기
1/8
post-thumbnail

πŸ’β€β™€οΈ JPAλž€,
μžλ°” μ§„μ˜μ˜ ORM(Object Relational Mapping) 기술 ν‘œμ€€μœΌλ‘œ ORM κΈ°μˆ μ„ μ‚¬μš©ν•˜κΈ° μœ„ν•œ ν‘œμ€€ μΈν„°νŽ˜μ΄μŠ€μ˜ λͺ¨μŒ


πŸ’β€β™€οΈ ORMμ΄λž€,
객체관계 λ§€ν•‘. μžλ°” ν”Œλž«νΌ SE와 EEλ₯Ό μ‚¬μš©ν•˜λŠ” μ‘μš©ν”„λ‘œκ·Έλž¨μ—μ„œ κ°μ²΄λŠ” 객체 μ§€ν–₯적으둜 μ„€κ³„ν•˜κ³  κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€λŠ” κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€μ˜ νŒ¨λŸ¬λ‹€μž„λŒ€λ‘œ 섀계할 수 μžˆλ„λ‘ μ€‘κ°„μ—μ„œ 맀핑을 ν•΄μ£ΌλŠ” 기술

  • μžλ°” 객체와 DBν…Œμ΄λΈ”μ„ λ§€ν•‘ν•˜κ³  μžλ°” κ°μ²΄κ°„μ˜ 관계λ₯Ό ν† λŒ€λ‘œ SQL을 생성 및 μ‹€ν–‰ ν•  수 있으며 λŒ€μ€‘μ μΈ μ–Έμ–΄μ—λŠ” λŒ€λΆ€λΆ„ ORM 기술이 쑴재

πŸ™‹β€ μ™œ JPAλ₯Ό μ‚¬μš©ν•˜λ‚˜μš”?

πŸ‘‰ JPA의 μž₯점

  • 객체지ν–₯κ³Ό 관계지ν–₯μ΄λΌλŠ” μ„œλ‘œ λ‹€λ₯Έ νŒ¨λŸ¬λ‹€μž„ 뢈일치λ₯Ό ν•΄μ†Œν•΄ μ£Όλ©° SQL 쀑심이 μ•„λ‹Œ 객체지ν–₯ νŒ¨λŸ¬λ‹€μž„ μ€‘μ‹¬μ˜ 개발이 κ°€λŠ₯
  • κ°œλ°œμžκ°€ 직접 SQL을 λ”°λ‘œ μž‘μ„±ν•˜μ§€ μ•Šμ•„λ„ SQL문을 μž‘μ„±ν•΄ μ£Όλ―€λ‘œ 생산성이 ν–₯상생산성이 ν–₯상
  • SQL을 μˆ˜μ •ν•  ν•„μš”κ°€ μ—†μœΌλ―€λ‘œ μ„€μ • 및 ν•„λ“œ λ³€κ²½μ‹œ SQL이 μžλ™ μˆ˜μ •λ˜μ–΄ μœ μ§€λ³΄μˆ˜κ°€ ν–₯상
  • DB의 μ’…λ₯˜μ— 따라 SQL문에 μžˆμ–΄ λ‹€μ†Œ 차이가 μžˆμ§€λ§Œ JPAλŠ” 개발자 λŒ€μ‹  이λ₯Ό νŒλ‹¨ν•˜κ³  ν•΄λ‹Ή DB에 λ§žλŠ” SQL을 μž‘μ„±
  • μΊμ‹œλ₯Ό ν™œμš©ν•œ μ„±λŠ₯ μ΅œμ ν™”λ‘œ 인해 νŠΈλžœμž­μ…˜μ„ μ²˜λ¦¬ν•˜λŠ” μ‹œκ°„μ΄ ꡉμž₯히 많이 단좕

πŸ‘‰ JPA의 단점

  • λ„ˆλ¬΄ λ³΅μž‘ν•œ SQL을 μž‘μ„±ν•˜κΈ°μ—λŠ” 적합 X
  • JPAλ₯Ό μ œλŒ€λ‘œ μ΄ν•΄ν•˜μ§€ λͺ»ν•˜κ³  μž‘μ„±μ‹œ μ„±λŠ₯μ €ν•˜ λ°œμƒ κ°€λŠ₯μ„±
  • 객체지ν–₯ νŒ¨λŸ¬λ‹€μž„κ³Ό κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€ νŒ¨λŸ¬λ‹€μž„μ— λŒ€ν•œ 이해가 μ—†λŠ” μƒνƒœλ‘œλŠ” μ œλŒ€λ‘œ 이해할 수 X
  • λ³΅μž‘ν•œ 동적 SQL같은 경우 순수 JPAλ§ŒμœΌλ‘œλŠ” λΆ€μ‘±ν•œ 뢀뢄에 μžˆμ–΄ μΆ”κ°€ 라이브러리λ₯Ό ν™œμš©ν•΄μ•Ό ν•  κ²½μš°κ°€ 생길 κ°€λŠ₯μ„± O

πŸ’β€β™€οΈ κ³ λ € ν•΄μ•Όν•  점
μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ 고도화 되면 JPAλ₯Ό κ΅¬ν˜„ν•˜μ—¬ 손이 많이 κ°€λŠ” 것 보닀 Mybatisκ°€ 닡이 될 μˆ˜λ„ 있음

  • JPAκ°€ 무쑰건 쒋은 것 X
  • λ‹€λ§Œ JPAλŠ” μΆ”κ°€ 라이브러리λ₯Ό ν™œμš©ν•˜λ©΄ λ³΅μž‘ν•œ SQLμ΄λ‚˜ 동적 SQL에 μžˆμ–΄μ„œ 도움을 받을 수 있음

πŸ‘€ JPA의 원리

πŸ‘‰ JPA의 κΈ°λ³Έ λ™μž‘λ°©μ‹

  • JPAλŠ” μ—”ν‹°ν‹°λ₯Ό μ €μž₯ν•˜λŠ” ν™˜κ²½μΈ μ˜μ†μ„± μ»¨ν…μŠ€νŠΈ(Persistence Context)λ₯Ό 톡해 μ—”ν‹°ν‹°λ₯Ό λ³΄κ΄€ν•˜κ³  관리
  • μ—”ν‹°ν‹°(Entity) : @Entity, @Table, @Id, @Columnκ³Ό 같은 μ–΄λ…Έν…Œμ΄μ…˜μ„ 톡해 SQL이 μ•„λ‹Œ DB ν…Œμ΄λΈ”κ³Ό λ§€ν•‘λ˜κ²Œ μž‘μ„±λœ 클래슀

πŸ‘‰ μ—”ν‹°ν‹°μ˜ Persistence Contextμ—μ„œμ˜ 생λͺ…μ£ΌκΈ°

  • Persistence Context : μ—”ν‹°ν‹° λ©”λ‹ˆμ €κ°€ μ—”ν‹°ν‹°λ₯Ό μ €μž₯ν•˜λŠ” κ³΅κ°„μœΌλ‘œ μ—”ν‹°ν‹°λ₯Ό λ³΄κ΄€ν•˜κ³  관리
  • μ—”ν‹°ν‹° λ§€λ‹ˆμ €κ°€ 생성될 λ•Œ ν•˜λ‚˜μ˜ μ˜μ†μ„± μ»¨ν…μŠ€νŠΈκ°€ λ§Œλ“€μ–΄μ§
μƒνƒœμ„€λͺ…
λΉ„μ˜μ†(new/transient)μ—”ν‹°ν‹°κ°€ μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ™€ μ „ν˜€ 관계가 μ—†λŠ” μƒνƒœ
μ˜μ†(managed)μ—”ν‹°ν‹°κ°€ μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ— μ €μž₯된 μƒνƒœ
μ€€μ˜μ†(detached)μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ— μ €μž₯λ˜μ—ˆλ‹€κ°€ λΆ„λ¦¬λœ μƒνƒœ
μ‚­μ œ(removed)μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ— μ €μž₯λ˜μ—ˆλ‹€κ°€ λΆ„λ¦¬λœ μƒνƒœ
병합(merge)μ—”ν‹°ν‹°κ°€ μ€€μ˜μ† μƒνƒœμΈ μ—”ν‹°ν‹°κ°€ λ‹€μ‹œ μ˜μ†μƒνƒœλ‘œ λ³€κ²½λœ μƒνƒœ

find() : 쑰회
persist() : 등둝
remove() : μ‚­μ œ
detach() : 뢄리
merge() : detached Entity 병합
clear() : Persistence Context μ΄ˆκΈ°ν™”
close() : Persistence Context μ‚¬μš© μ’…λ£Œ
commit() / flush() : 컀밋

πŸ‘‰ μ˜μ†μ„± μ»¨ν…μŠ€νŠΈκ°€ μ—”ν‹°ν‹°λ₯Ό κ΄€λ¦¬ν•˜λŠ” 원리

[1] 1μ°¨ μΊμ‹œ

μ˜μ†μ„± μ»¨ν…μŠ€νŠΈ 내뢀에 Map으둜 κ΄€λ¦¬λ˜λŠ” μΊμ‹œ
(keyλŠ” @Id이자 λ§€ν•‘ν•œ μ‹λ³„μž, valueλŠ” μ—”ν‹°ν‹° μΈμŠ€ν„΄μŠ€)
πŸ‘‰ 이 곳에 μžˆλŠ” μ—”ν‹°ν‹°λŠ” μΊμ‹œμ—μ„œ λ°”λ‘œ 뢈러였기 λ•Œλ¬Έμ— 쑰회 μ„±λŠ₯ ν–₯상

[2] 동일성 보μž₯

λ°˜λ³΅ν•΄μ„œ 호좜 μ‹œ 1μ°¨ μΊμ‹œμ—μ„œ 같은 μ—”ν‹°ν‹° μΈμŠ€ν„΄μŠ€λ₯Ό κ°€μ Έμ˜¬ 수 있음

[3] νŠΈλžœμž­μ…˜μ„ μ§€μ›ν•˜λŠ” μ“°κΈ° μ§€μ—°(transactional write-behind)

예λ₯Ό λ“€μ–΄ μ—”ν‹°ν‹° 등둝(INSERT) μ‹€ν–‰ μ‹œ, μ—”ν‹°ν‹° λ§€λ‹ˆμ €λŠ” νŠΈλžœμž­μ…˜μ„ μ»€λ°‹ν•˜κΈ° μ§μ „κΉŒμ§€ λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯(flush) λŒ€μ‹ , μ“°κΈ° μ§€μ—° SQL μ €μž₯μ†Œμ— INSERT SQL을 차곑차곑 μŒ“κ²Œ 되며 컀밋 μ‹œμ— 쿼리λ₯Ό λ°μ΄ν„°λ² μ΄μŠ€λ‘œ λ³΄λ‚΄λŠ”λ° 이λ₯Ό νŠΈλžœμž­μ…˜μ„ μ§€μ›ν•˜λŠ” μ“°κΈ° 지연이라고 함

πŸ’β€β™€οΈ ν”ŒλŸ¬μ‹œ(flush)λž€, μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ˜ λ³€κ²½ λ‚΄μš©μ„ λ°μ΄ν„°λ² μ΄μŠ€μ— λ°˜μ˜ν•˜λŠ” 것

  • ν”ŒλŸ¬μ‹œ 절차
    - μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ— 보관할 λ•Œ 졜초 μ—”ν‹°ν‹° μƒνƒœλ₯Ό λ³΅μ‚¬ν•΄μ„œ μŠ€λƒ…μƒ·μœΌλ‘œ μ €μž₯ν•΄ 두고 λͺ¨λ“  μ—”ν‹°ν‹°λ₯Ό μŠ€λƒ…μƒ·κ³Ό λΉ„κ΅ν•˜μ—¬ μˆ˜μ •λœ μ—”ν‹°ν‹°λ₯Ό 찾은 ν›„, μˆ˜μ • 쿼리λ₯Ό λ§Œλ“€μ–΄ μ“°κΈ° μ§€μ—° SQL μ €μž₯μ†Œμ— 보냄
    - μ“°κΈ° μ§€μ—° SQL μ €μž₯μ†Œμ˜ 쿼리λ₯Ό λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯
  • ν”ŒλŸ¬μ‹œλ₯Ό ν•˜λŠ” 경우
    • em.flush()λ₯Ό 직접 호좜
    • νŠΈλžœμž­μ…˜ 컀밋 μ‹œ ν”ŒλŸ¬μ‹œκ°€ μžλ™ 호좜
    • JPQL 쿼리 μ‹€ν–‰ μ‹œ ν”ŒλŸ¬μ‹œκ°€ μžλ™ 호좜

[4] λ³€κ²½ 감지(dirty checking)

πŸ’β€β™€οΈ λ³€κ²½ κ°μ§€λž€, SQL에 μ˜μ‘΄μ μ΄μ§€ μ•Šλ„λ‘ μ—”ν‹°ν‹°μ˜ 데이터 변경을 κ°μ§€ν•˜κ³  λ°μ΄ν„°λ² μ΄μŠ€μ— μžλ™μœΌλ‘œ λ°˜μ˜ν•˜λŠ” κΈ°λŠ₯
μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ— 보관할 λ•Œ 졜초 μ—”ν‹°ν‹° μƒνƒœλ₯Ό λ³΅μ‚¬ν•΄μ„œ μ €μž₯ν•œ μŠ€λƒ…μƒ·κ³Ό 이λ₯Ό λΉ„κ΅ν•˜μ—¬ κ°μ§€ν•˜λ©° μ˜μ† μƒνƒœμ˜ μ—”ν‹°ν‹°μ—λ§Œ 적용됨 (μ€€μ˜μ†μ΄λ‚˜ λΉ„μ˜μ†μ€ ν•΄λ‹Ή X)

  • λ³€κ²½ 감지 절차 (컀밋 μ‹€ν–‰ μ‹œ)
    1. μš°μ„  μ—”ν‹°ν‹° λ§€λ‹ˆμ € λ‚΄λΆ€μ—μ„œ λ¨Όμ € ν”ŒλŸ¬μ‹œ(flush)κ°€ 호좜됨
    2. 엔티티와 μŠ€λƒ…μƒ·μ„ λΉ„κ΅ν•΄μ„œ λ³€κ²½λœ μ—”ν‹°ν‹°λ₯Ό 찾음
    3. λ³€κ²½λœ 엔티티와 κ΄€λ ¨λœ μˆ˜μ • 쿼리λ₯Ό μƒμ„±ν•΄μ„œ μ“°κΈ° μ§€μ—° SQL μ €μž₯μ†Œμ— 보냄
    4. μ“°κΈ° μ§€μ—° μ €μž₯μ†Œμ˜ SQL을 λ°μ΄ν„°λ² μ΄μŠ€λ‘œ 보냄
    5. λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ νŠΈλžœμž­μ…˜μ„ 컀밋
profile
Tiny little habits make me

0개의 λŒ“κΈ€