[JPA] Dirty Checking
π Dirty Checkingμ΄λ?
Dirty Checking
(λ³κ²½ κ°μ§)λ JPAκ° μμ μνμΈ μν°ν°μ κ°μ΄ λ°λμλμ§λ₯Ό μλμΌλ‘ κ°μ§ν΄, νΈλμμ
μΒ flush
νλ μκ° νμνΒ UPDATE
 쿼리λ₯Ό λμ μΌλ‘ μμ±νμ¬ μ€ννλ κΈ°λ₯μ΄λ€. λ°λ‘ save
λλ saveAndFlush
λ©μλλ₯Ό νΈμΆνμ§ μμλ νΈλμμ
μ΄ λλ λ μλμΌλ‘ μν°ν° λ³κ²½ λ΄μ©μ΄ DBμ λ°μλλ€.
μ€μμ λλ λΉμμ μν°ν°λ Dirty Checking λμμ΄ μλλ€. μ¦, μ΄λ€μ νΈλμμ μ΄ λλλ λ³κ²½ λ΄μ©μ΄ DBμ μλμΌλ‘ λ°μλμ§ μλλ€.
π λμ κ³Όμ
persist
, find
λ©μλ λ±μΌλ‘ μν°ν°κ° μμ μνκ° λλ©΄, μ€μ μν°ν° κ°μ²΄λ 1μ°¨ μΊμμ μ μ₯λκ³ , μν°ν°μ μ€λ
μ· λν ν¨κ» 보κ΄λλ€.
νΈλμμ λ΄μμ μν°ν°μ νλλ₯Ό μμ ν΄λ μ¦μ μΏΌλ¦¬λ¬Έμ΄ DBμ λ λΌκ°λ κ²μ΄ μλλ€. λ³κ²½ λ΄μ©μ μμμ± μ»¨ν μ€νΈμλ§ λ°μλλ€.
νΈλμμ
μ΄ μ»€λ°λλ©΄ flush
κ° νΈμΆλκ² λλλ°, JPAλ flush μμ μμ 1μ°¨ μΊμμ μ€λ
μ·κ³Ό μν°ν°λ₯Ό νλλ³λ‘ λΉκ΅νμ¬ λ¬λΌμ§ μ μ΄ μλμ§ νμΈνλ€. λ§μ½ μλ€λ©΄, μ°κΈ° μ§μ° SQL μ μ₯μμ UPDATE
쿼리λ₯Ό μμ±νμ¬ λ£λλ€.
flush
λ§μ§λ§ λ¨κ³μμ μ°κΈ° μ§μ° SQL μ μ₯μμ 쿼리λ₯Ό DBμ μ μ‘νκ³ , μ€μ νΈλμμ
컀λ°μ΄ μΌμ΄λλ©΄μ λ³κ²½ μ¬νμ DBμ λ°μλκ² λλ€.
π νΉμ§
μμ±λλ UPDATE
쿼리λ λ³κ²½λ νλκ° μλλΌ λͺ¨λ νλκ° ν¬ν¨λ 쿼리μ΄λ€. λ³κ²½λ νλκ° λ§μΆ° 쿼리λ₯Ό νμ±νλ λΉμ©λ³΄λ€ λͺ¨λ νλλ₯Ό μ μ‘νλλ‘ νλ λ°©λ²μ λΉμ©μ΄ λ μ μ μ μμΌλ©°, νμ κ°μ 쿼리λ₯Ό μ¬μ©νλ―λ‘ μΏΌλ¦¬λ₯Ό μΊμνμ¬ μ¬μ©ν μ μλ€.
λ€λ§ μν°ν°μ μ€λ
μ·μ λ©λͺ¨λ¦¬μ 보κ΄νκΈ° λλ¬Έμ, μν°ν°μ μκ° λ§κ±°λ νλκ° λ§λ€λ©΄ λ©λͺ¨λ¦¬ μ¬μ©λμ΄ μ¦κ°νκ² λλ€. λν flush μμ μμ μμ μν°ν°μ νλ κ° λΉκ΅ μ λΉμ©λ μ¦κ°νλ€. κΉμν λμ βμλ° ORM νμ€ JPA νλ‘κ·Έλλ°βμ μνλ©΄, νλκ° 30κ°κ° λμ΄κ°λ©΄ μ 체 νλ UPDATE
쿼리문μ μ₯μ μ΄ ν΄μλλ€κ³ νλ€.
μ΄ κ²½μ°, @DynamicUpdate
λ₯Ό μ¬μ©νλ©° μμ λ νλμ λν΄μλ§ UPDATE
쿼리λ₯Ό μμ±νλλ‘ ν μ μλ€. λ€λ§, νλκ° 30κ°κ° λμ΄κ°λ μν©μ΄λΌλ©΄ ν
μ΄λΈ μ€κ³λ₯Ό λ€μ μ΄ν΄ λ³Ό νμκ° μλ€.
λλ νΉμ νλλ§ μ
λ°μ΄νΈνλ JPQL
쿼리λ₯Ό μμ±νλ λ°©λ²λ μλ€. λ€λ§ μ΄ λ°©λ²μ DBμ μμμ± μ»¨ν
μ€νΈ κ° λΆμΌμΉνλ μν©μ΄ λ°μν μ μλ€. JPQL 쿼리λ μμμ± μ»¨ν
μ€νΈλ₯Ό κ±°μΉμ§ μκ³ λ°λ‘ DBμ 쿼리λ₯Ό μ μ‘νκΈ° λλ¬Έμ΄λ€.
λ§μ½ μ½κΈ° μ μ© νΈλμμ
μ΄λΌλ©΄, @Transaction(readOnly = true)
λ₯Ό ν΅ν΄ Dirty Checkingμ μλ΅ν μ μλ€.
π μ°Έκ³
https://jojoldu.tistory.com/415