μλ ,
μ°λ¦¬λ postgres-db+spring boot+spring data+r2dbcλ‘ κ΅¬μ±λ νμ¬ μννΈμ¨μ΄ μννΈμ¨μ΄λ₯Ό λ체νκΈ° μν΄ μ΅λ μ μ λͺ¨λ λ°μμ μ§μμ μΌλ‘ νκ°νκ³ μμ΅λλ€. μ°λ¦¬λ r2dbcλ₯Ό μ¬μ©νμ¬ λ§μ μ νμ μ§λ©΄νκ³ Hibernateμ λν΄ μ΄λ―Έ κ°μ§κ³ μλ λ§μ μ§μμ μ¬μ¬μ©νκ³ μΆμμ΅λλ€.
μ°λ¦¬λ μ 체 λ§μ΄ν¬λ‘ μλΉμ€λ₯Ό κ±°μ 리ν©ν λ§νκ³ μ체 μ€νλ§ λ°μ΄ν°(μΌλ° 리ν¬μ§ν 리)λ₯Ό λ€μ μμ±νμΌλ©° μ λ§ μ’μ 보μ
λλ€.
κ°λ°μκ° νλ‘κ·Έλλ° λ°©μ λμ μ μΈμ νΈλμμ κ΄λ¦¬(μ£Όμ μ¬μ©)λ₯Ό μ¬μ©νλ μ΅μ μμ μ κΈ°νλ μ£Όμ λ¬Έμ μ€ νλμ λλ€.
μ°λ¦¬λ κ·Έλ¬ν λ©μ»€λμ¦μ ꡬννλ κ²μ΄ Hibernate Reactiveμ λͺ©μ μ΄ μλλΌ νμ€ Hibernateμ λν΄ μνλ κ²μ²λΌ Hibernateμ ν΅ν©λλ νλ μμν¬(Spring, Quarkus...)μ λν κ²μμ μκ³ μμ΅λλ€. μ°λ¦¬κ° μ§μ νκ³ μΆμ΄λ Hibernate Reactiveμ νΈλμμ APIλ νμ€ Hibernate APIμ κ°μ§ μκ³ νΈλμμ κ΄λ¦¬μμ μνΈ μμ©ν APIκ° μμ΅λλ€.
μ΄μ λν κ·νμ μ견μ μ»μ μ μκ³ (ν μ μλ κ²½μ° λ λ§μ :smiley:), κ·Έλ¦¬κ³ μ¬μ ν μΌλ°μ μΈ μ§μΉ¨μ μ μνκΈ° μν΄ ν μ μλ€κ³ μκ°νλ€λ©΄ νμ¬λ‘μλ μ΄λ»κ² ν΄μΌ νλμ§μ λν λ¨μκ° μκΈ° λλ¬Έμ μ λ κΈ°μ κ²μ
λλ€.
κ°μ¬ ν΄μ
Springμλ μΈν°μ
ν°λ₯Ό bean λ©μλ νΈμΆμ λ°μΈλ©νκΈ° μν΄ μ£Όμμ μ¬μ©ν μ μλ μΌμ’
μ μΈν°μ
ν° κ°λ
μ΄ μλ€κ³ κ°μ ν©λλ€. μ΄μ κ°μ΄ μΈν°μ
ν° λ΄μμ withTransaction()
λ₯Ό νΈμΆν λ€μ Bean λ©μλμ μμνλ©΄ μ μΈμ νΈλμμ
κ΄λ¦¬κ° μ λΆμ
λλ€. μ€μ λ‘λ λͺ μ€μ μ½λλ§ μμΌλ©΄ λ©λλ€. (μ μ΄λ κ·Έκ²μ CDIμ μμ κ²μ
λλ€. λλ λ΄μ λν΄ λ νμ ν©λλ€.)
μ μΌν λ―Έλ¬ν¨μ νμ¬ λ°μ μ€νΈλ¦Όμ μ΄λ―Έ λ°μΈλ©λ νΈλμμ μ΄ μλμ§ κ°μ§νλ λ°©λ²μ΄ νμνλ€λ κ²μ λλ€. μ°λ¦¬ μ€νμμλ MP 컨ν μ€νΈλ₯Ό μ¬μ©νμ¬ μνλ©λλ€. κ·Έκ²μ΄ Spring Landμμ μ΄λ»κ² μνλλμ§ μ ν λͺ¨λ¦ λλ€.
(OTOH XA νΈλμμ κ΄λ¦¬μμ ν΅ν©νλ λ°©λ²μ λν΄ λ¬»λλ€λ©΄ κΈμμ, κ·Έκ²μ μμ ν λ€λ₯Έ μ μΊμ΄λ©° νμ¬ λ°μ λλΌμ΄λ²μ μ€μ λ‘ μ€μ©μ μ΄μ§ μμ΅λλ€. μ°λ¦¬λ μμ§ μ§μ ν λ°μ νΈλμμ μ΄ μμ΅λλ€. κ΄λ¦¬μ.)
μ§κΈμ λΆμ° νΈλμμ μ΄ νμνμ§ μμ΅λλ€.
κ·Έλ¬λ©΄ SessionFactory.withTransaction()
λ₯Ό νΈμΆνλ μΈν°μ
ν°κ° μ λλ‘ μλν΄μΌ ν©λλ€.
μ΄ λ°©λ²μ μλνκ³ μ λ°μ΄νΈν©λλ€. κ°μ¬ ν΄μ
@gavinking Springμ Aspectλ₯Ό μ¬μ©νμ¬ @Transactional μ ꡬννλ κ²μΌλ‘ 보μ
λλ€. κ·Έλ€μ§ μ€μνμ§λ μμ§λ§ ꡬννλ κ²μ΄ λ κ°λ¨ν μλ μμ΅λλ€.
νμ§λ§ openSession() λ° closeSession() APIκ° μμΌλ―λ‘ Stage ν΄λμ€μμ openTransaction() commitTransaction() λ° rollbackTransaction()μ λν APIλ₯Ό λ
ΈμΆνλ κ²½μ°μλ§ ν μ μλ€κ³ μκ°ν©λλ€. νΈλμμ
κ°μ²΄κ° νμνκ³ withTransactionμ΄ μΆ©λΆνμ§ μλ€κ³ μκ°ν©λλ€.
λ§μ΄ λ©λκΉ?
λ©ννκ³ λ©μλλ‘ μ λ¬ν μ μλ "μ£Όλ³" μΈν°μ ν°μ λν μΌμ’ μ κ°λ μ΄ μμ΄μΌ ν©λλ€.
(before/after μΈν°μ ν°λ‘λ ν μ μλ κ²μ΄ μ¬μ€μ λλ€.)
λλ μ΄κ²μ΄ νλλΌκ³ μκ°νλ€: https://howtodoinjava.com/spring-aop/aspectj-around-annotation-example/
@gavinking "MP 컨ν
μ€νΈλ₯Ό μ¬μ©νμ¬ μνν μ€νμμ" μ μ μμ±ν λ΄μ©μ λν΄ μμΈν μ€λͺ
ν΄ μ£Όμκ² μ΅λκΉ? νΈλμμ
μ΄ νμ¬ μ€νΈλ¦Όμ μ΄λ―Έ λ°μΈλ©λμ΄ μλμ§ νμΈνλ €λ©΄? μμ±ν μ½λλ ν
μ€νΈλ₯Ό μ°Έμ‘°ν μ μμ΅λκΉ? μΈμ
μ λν΄μλ λ§μ°¬κ°μ§μ
λλ€. μΈμ
μ΄ νμ¬ μ€νΈλ¦Όμμ μ΄λ―Έ μ΄λ € μλ€λ κ²μ μ΄λ»κ² μ΄ν΄ν μ μμ΅λκΉ?
κ°μ¬ ν΄μ.
λ΄μ μ΄λ»κ² νλμ§ λͺ¨λ₯΄κ² μ΄μ. threadlocalκ³Ό λΉμ·νμ§λ§ μ€λ λ λμ νμ¬ λ°μ μ€νΈλ¦Όμ λ‘컬 λ°μΈλ©λ μΌμ’ μ ꡬμ±μ΄ νμν©λλ€. λλ κ·Έλ€μκ² λκ°κ° μμ΄μΌνλ€κ³ νμ ν©λλ€.
λλ νμ¬ spring @Transactional μ μ¬μ©νμ§ μμ κ²μ΄μ§λ§ Springμ λν΄ λ무 κΉμ΄ λ€μ΄κ°λ κ²μ νΌνκΈ° μν΄ μ°λ¦¬ μμ μ νΈλμμ μ£Όμμ ꡬνν©λλ€. κ·Έλμ λ΄ μ΄μ μ§λ¬Έμ "MP 컨ν μ€νΈλ₯Ό μ¬μ©νμ¬ μνν μ€νμμ"λΌλ λ¬Έμ₯κ³Ό κ΄λ ¨μ΄ μμ΅λλ€.
"μ°λ¦¬ μ€ν" == Quarkus.
Spring νκ²½μμ λΉμ·ν κ²μ μ°ΎμμΌ νλ€κ³ λ§νκ³ μμ΅λλ€.
κ°μ νμ¬ λ°μ μ€νΈλ¦Όμ λ°μΈλ©ν μ μλ€λ©΄ μ μΈμ νΈλμμ
μ κ°μ§ μ μκ³ κ°λ¨νκ² νΈλμμ
μ "μλμΌλ‘" κ΄λ¦¬ν΄μΌ νκΈ° λλ¬Έμ
λλ€. ( withTransaction()
λ₯Ό νΈμΆνλ©΄ μ€μ λ‘ λ§€μ° κ°λ¨ν©λλ€. μ¬λλ€μ΄ μ μ£Όμμ΄ νμνλ€κ³ μκ°νλμ§ λͺ¨λ₯΄κ² μ΅λλ€.)
νμ§λ§ μ΄λ»κ²λ ν μ μλ λ°©λ²μ΄ μμ΄μΌ νλ€κ³ νμ ν©λλ€. λΉμ μ λ¨μ§ μλͺ»λ μ¬λμκ² λ¬»κ³ μμ΅λλ€.
μ΄λ° κ²μΌ μλ μμ§λ§ μ λ μ λ§ λͺ¨λ¦ λλ€ https://projectreactor.io/docs/core/3.4.0-M1/api/index.html?reactor/util/context/Context.html
μλ§λ μ΄κ²μ? https://www.baeldung.com/spring-transaction-active
λ§κ°: #782λ‘ λ체λ¨.
@yaakov-berkovitchμ ν¨κ» #779λ₯Ό μ¬μ©νμ¬ μ΄ μμ μ ꡬννλ κ²μ΄ ν¨μ¬ λ μ¬μΈ κ²μ λλ€.
@gavinking κ°μ¬ν©λλ€!!