🌈 [Section3] 9. [ Spring MVC ] νŠΈλžœμž­μ…˜

ν˜„μ£ΌΒ·2022λ…„ 11μ›” 7일
0

bootcamp

λͺ©λ‘ 보기
49/71

πŸ“• 였늘 배운 λ‚΄μš©!

  • νŠΈλžœμž­μ…˜
  • λΆ„μ‚° νŠΈλžœμž­μ…˜

✏️ νŠΈλžœμž­μ…˜(Transaction)

  • μ—¬λŸ¬κ°œμ˜ μž‘μ—…λ“€μ„ ν•˜λ‚˜μ˜ 그룹으둜 λ¬Άμ–΄μ„œ μ²˜λ¦¬ν•˜λŠ” 처리 λ‹¨μœ„

  • μ—¬λŸ¬ 개의 μž‘μ—…μ΄ ν•˜λ‚˜μ˜ μž‘μ—…μœΌλ‘œ μΈμ‹ν•΄μ„œ μ „λΆ€ μ„±κ³΅ν•˜λ“ κ°€ μ „λΆ€ μ‹€νŒ¨ν•˜λ“ κ°€(All or Nothing)의 λ‘˜ 쀑 ν•˜λ‚˜λ‘œλ§Œ μ²˜λ¦¬λ˜μ–΄μ•Ό νŠΈλžœμž­μ…˜μ˜ 의미λ₯Ό 가짐
    ➜ λ°μ΄ν„°μ˜ 무결성을 보μž₯ν•˜λŠ” 핡심적인 μ—­ν• 

  • μ‹ λ’°ν•  수 μžˆλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ΅¬μΆ•ν•˜κΈ° μœ„ν•΄μ„œ κ°€μž₯ μ€‘μš”ν•œ λΆ€λΆ„ 쀑 ν•˜λ‚˜
    ( μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 신뒰성이 κΉ¨μ§€λŠ” 상황이 λ°œμƒν•˜λ©΄ νŠΈλžœμž­μ…˜μ΄λΌκ³  λΆ€λ₯Ό 수 μ—†μŒ )

  • λΆ€κ°€ κΈ°λŠ₯이기 λ•Œλ¬Έμ— AOP의 적용 λŒ€μƒ 쀑 ν•˜λ‚˜

  • 둜컬 νŠΈλžœμž­μ…˜ / λΆ„μ‚° νŠΈλžœμž­μ…˜μœΌλ‘œ λ‚˜λ‰¨

    βœ”οΈ 둜컬 νŠΈλžœμž­μ…˜
    ν•˜λ‚˜μ˜ μžμ› κ΄€λ¦¬μž(λ°μ΄ν„°λ² μ΄μŠ€)κ°€ μ°Έμ—¬ν•˜λŠ” νŠΈλžœμž­μ…˜
    β €
    βœ”οΈ λΆ„μ‚° νŠΈλžœμž­μ…˜
    ν•˜λ‚˜ μ΄μƒμ˜ μžμ› κ΄€λ¦¬μž(λ°μ΄ν„°λ² μ΄μŠ€)와 ν•˜λ‚˜ μ΄μƒμ˜ 물리적인 μ‚¬μ΄νŠΈκ°€ ν•˜λ‚˜μ˜ 논리적인 λ‹¨μœ„λ‘œ μ°Έμ—¬ν•˜λŠ” νŠΈλžœμž­μ…˜

  • λ°μ΄ν„°λ² μ΄μŠ€μ™€ 관련이 μ—†λŠ” ν–‰μœ„λ„ μ—¬λŸ¬ μž‘μ—…μ΄ μ›μžμ„±μ„ 가지고 μ²˜λ¦¬λ˜μ–΄μ•Ό ν•œλ‹€λ©΄ ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜μœΌλ‘œ λ³Ό 수 있음
    Ex. 파일 생성 및 μ—…λ‘œλ“œ, 이메일 전솑, λ©”μ‹œμ§€ 전솑 λ“±

πŸ’‘ νŠΈλžœμž­μ…˜ λ²”μœ„μ™€ μ˜μ†μ„± μ»¨ν…μŠ€νŠΈ, Fascade λ²”μœ„
[μ°Έκ³ ] https://willseungh0.tistory.com/73

βœ” Springμ—μ„œ μ‚¬μš©λ˜λŠ” νŠΈλžœμž­μ…˜ 방식

  • μ„ μ–Έν˜• νŠΈλžœμž­μ…˜ 방식

  • ν”„λ‘œκ·Έλž˜λ° μ½”λ“œ 베이슀 νŠΈλžœμž­μ…˜ 방식
    ( 이건 그리 μ μ ˆν•œ νŠΈλžœμž­μ…˜ 방식이 μ•„λ‹˜ )

❗ Spring Boot μ—μ„œ νŠΈλžœμž­μ…˜μ„ μ‚¬μš©ν•  경우, κ΄€λ ¨ μ„€μ • 없이 λ‚΄λΆ€μ μœΌλ‘œ μ•Œμ•„μ„œ ν•΄μ€Œ
( Spring Boot을 μ‚¬μš©ν•˜μ§€ μ•Šμ„ 경우 λ”°λ‘œ 섀정을 ν•΄μ€˜μ•Όν•¨ )

πŸ’‘ Spring μ—μ„œμ˜ νŠΈλžœμž­μ…˜

  • PlatformTransactionManager에 μ˜ν•΄ 관리됨
    PlatformTransactionManager μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•΄μ„œ ν•΄λ‹Ή 데이터 μ•‘μ„ΈμŠ€ κΈ°μˆ μ— 맞게 μœ μ—°ν•˜κ²Œ νŠΈλžœμž­μ…˜μ„ 적용 ν•  수 μžˆλ„λ‘ 좔상화 λ˜μ–΄ 있음
    ➜ μš°λ¦¬κ°€ μ‚¬μš©ν•˜λŠ” JPA 데이터 μ•‘μ„ΈμŠ€ κΈ°μˆ μ„ μ‚¬μš©ν•œλ‹€λ©΄, PlatformTransactionManager의 κ΅¬ν˜„ 클래슀인 JpaTransactionManager μ‚¬μš©

✏️ ACID 원칙

βœ”οΈ μ›μžμ„±(Atomicity)

  • μž‘μ—…μ„ 더이상 μͺΌκ°€ 수 μ—†μŒ

  • ν•˜λ‚˜μ˜ μž‘μ—…μœΌλ‘œ μΈμ‹ν•΄μ„œ λ‘˜ λ‹€ μ„±κ³΅ν•˜λ“ κ°€ λ‘˜ λ‹€ μ‹€νŒ¨ν•˜λ“ κ°€(All or Nothing) μ€‘μ—μ„œ ν•˜λ‚˜λ‘œλ§Œ μ²˜λ¦¬λ˜λŠ” 것이 보μž₯λ˜μ–΄μ•Ό 함

βœ”οΈ 일관성(Consistency)

  • λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ—μ„œ μ˜λ„ν•˜λŠ”λŒ€λ‘œ μΌκ΄€μ„±μžˆκ²Œ μ €μž₯λ˜κ±°λ‚˜ λ³€κ²½λ˜μ–΄μ•Ό 함
    Ex. μ£Όλ¬Έ 횟수만큼 μŠ€νƒ¬ν”„κ°€ μ¦κ°€ν•œλ‹€ λΌλŠ” 둜직이 있으면, μΌκ΄€λ˜κ²Œ 증가해야함

βœ”οΈ 격리성(Isolation)

  • μ—¬λŸ¬ 개의 νŠΈλžœμž­μ…˜μ΄ 싀행될 경우 각각 λ…λ¦½μ μœΌλ‘œ 싀행이 λ˜μ–΄μ•Ό 함
    Ex. 우리의 μ»΄ν“¨ν„°μ—μ„œ μ›Œλ“œμž‘μ—… / μŒμ•… μ‹€ν–‰ 이 두 가지 μž‘μ—…μ„ ν•œλ‹€λ©΄, μ΄λŠ” CPUκ°€ 이 두 ν”„λ‘œμ„ΈμŠ€λ₯Ό μ•„μ£Ό λΉ λ₯Έ 속도둝 λ²ˆκ°ˆμ•„κ°€λ©° μ‹€ν–‰μ‹œν‚€λŠ” 것

βœ”οΈ 지속성(Durability)

  • νŠΈλžœμž­μ…˜μ΄ μ™„λ£Œλ˜λ©΄ κ·Έ κ²°κ³ΌλŠ” μ§€μ†λ˜μ–΄μ•Ό 함

  • λ°μ΄ν„°λ² μ΄μŠ€κ°€ μ’…λ£Œλ˜μ–΄λ„ λ°μ΄ν„°λŠ” 물리적인 μ €μž₯μ†Œμ— μ €μž₯λ˜μ–΄ μ§€μ†μ μœΌλ‘œ μœ μ§€λ˜μ–΄μ•Ό 함

[μ°Έκ³ ] https://ko.wikipedia.org/wiki/ACID


✏️ 컀밋(commit)

  • λͺ¨λ“  μž‘μ—…μ„ μ΅œμ’…μ μœΌλ‘œ λ°μ΄ν„°λ² μ΄μŠ€μ— λ°˜μ˜ν•˜λŠ” λͺ…λ Ήμ–΄

  • λ³€κ²½λœ λ‚΄μš©μ΄ λ°μ΄ν„°λ² μ΄μŠ€μ— 영ꡬ적으둜 μ €μž₯

  • commit λͺ…령을 μˆ˜ν–‰ ➜ ν•˜λ‚˜μ˜ νŠΈλžœμ μ…˜ 과정은 μ’…λ£Œ

❗ JPA APIλ₯Ό μ‚¬μš©ν•œ commit κ³Όμ •
➜ JPA κΈ°μˆ μ„ μ‚¬μš©ν•œ λ°μ΄ν„°λ² μ΄μŠ€μ™€μ˜ μΈν„°λž™μ…˜μ€ λ‚΄λΆ€μ μœΌλ‘œλŠ” JDBC APIλ₯Ό ν†΅ν•΄μ„œ 이루어짐

✏️ 둀백(rollback)

  • μž‘μ—… 쀑 λ¬Έμ œκ°€ λ°œμƒν–ˆμ„ λ•Œ, νŠΈλžœμž­μ…˜ λ‚΄μ—μ„œ μˆ˜ν–‰λœ μž‘μ—…λ“€μ„ μ·¨μ†Œν•˜μ—¬ νŠΈλžœμž­μ…˜ μ‹œμž‘ 이 μ „μ˜ μƒνƒœλ‘œ λ˜λŒμ•„κ°€λŠ” 것

✏️ μ„ μ–Έν˜• λ°©μ‹μ˜ νŠΈλžœμž­μ…˜ 적용

βœ” 1. μ• λ„ˆν…Œμ΄μ…˜ μΆ”κ°€ν•˜λŠ” 방식

βœ”οΈ @Transactional

  • 클래슀 λ ˆλ²¨μ— 뢙이면 ν•΄λ‹Ή 클래슀 λ‚΄μ˜ λͺ¨λ“  λ©”μ„œλ“œμ— νŠΈλžœμž­μ…˜ 적용됨

  • 이 μ• λ„ˆν…Œμ΄μ…˜μ΄ 뢙은 클래슀의 λ©”μ„œλ“œκ°€ 호좜되면 νŠΈλžœμž­μ…˜μ΄ ν•˜λ‚˜ 생성

  • 이 μ• λ„ˆν…Œμ΄μ…˜μ΄ 뢙은 λ©”μ„œλ“œ 내에 λ‹€λ₯Έ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜κ³  있으면 ν•œ νŠΈλžœμž­μ…˜μœΌλ‘œ λ¬Άμž„
    ➜ μ›μžμ„± 적용
    (ν•˜λ‚˜ μ‹€νŒ¨ν•˜λ©΄ λͺ¨λ‘ μ‹€νŒ¨ν•œ κ²ƒμœΌλ‘œ κ°„μ£Όν•˜μ—¬ rollback / λͺ¨λ‘ 성곡해야 commit )
    β €
    [μ°Έκ³ ] https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/transaction/annotation/Transactional.html

βœ”οΈ @Transactional의 μš°μ„ μˆœμœ„

  • λ©”μ„œλ“œ 레벨 > 클래슀 레벨

βœ”οΈ @Transactional의 μ• νŠΈλ¦¬λ·°νŠΈ

➜ 클래슀 내에 λ©”μ„œλ“œκ°€ 많으면 @Transactionalλ₯Ό 클래슀 λ ˆλ²¨μ— λΆ™μ΄λŠ” 게 λ°”λžŒμ§ν•˜κ³ , 클래슀 내에 μ‘°νšŒν•˜λŠ” λ©”μ„œλ“œκ°€ 적닀면 @Transactionalλ₯Ό 각각에 λΆ™μ΄λŠ” 게 λ°”λžŒμ§

  • @Transactional(readOnly = true)

    • νŠΈλžœμž­μ…˜μ˜ ν•΄λ‹Ή λ©”μ„œλ“œμ˜ 섀정을 readOnly둜 μ„€μ •ν•˜λŠ” 것

    • commit μ‹œ JPA λ‚΄λΆ€μ μœΌλ‘œ μ˜μ†μ„± μ»¨ν…μŠ€νŠΈλ₯Ό flushν•˜μ§€ μ•ŠμŒ
      ➜ flush 처리 / μŠ€λƒ…μƒ· 생성 λ“±μ˜ λΆˆν•„μš”ν•œ λ™μž‘ μ€„μž„
      β €
      ❗ 쑰회 λ©”μ„œλ“œμ—λŠ” readonly 속성을 true둜 μ§€μ •ν•΄μ„œ JPAκ°€ 자체적으둜 μ„±λŠ₯ μ΅œμ ν™” 과정을 κ±°μΉ˜λ„λ‘ ν•˜λŠ”κ²ƒμ΄ μ’‹μŒ

( 둜그λ₯Ό 보면 μ•„λž˜μ™€ 같이 속성이 readOnly둜 λ°”λ€ŒλŠ” κ±Έ 확인할 수 있음 ⬇️ )

  • νŠΈλžœμž­μ…˜ μ „νŒŒ (Transaction Propagation)
    ➜ νŠΈλžœμž­μ…˜μ˜ κ²½κ³„μ—μ„œ 진행 쀑인 νŠΈλžœμž­μ…˜μ΄ μ‘΄μž¬ν•  λ•Œ λ˜λŠ” μ‘΄μž¬ν•˜μ§€ μ•Šμ„ λ•Œ, μ–΄λ–»κ²Œ λ™μž‘ν•  것인지 κ²°μ •ν•˜λŠ” 방식
    β €
    ➜ propagation μ• νŠΈλ¦¬λ·°νŠΈλ₯Ό ν†΅ν•΄μ„œ μ„€μ •
    β €

    βœ”οΈ propagation μ• νŠΈλ¦¬λ·°νŠΈ

    • Propagation.REQUIRED
      ➜ propagation μœ ν˜•μ˜ λ””ν΄νŠΈ κ°’ / κ°€μž₯ 많이 μ‚¬μš©λ¨
      ➜ 진행 쀑인 νŠΈλžœμž­μ…˜μ΄ μ—†μœΌλ©΄ μƒˆλ‘œ μƒμ„±ν•˜μ—¬ μ‹œμž‘
      ➜ 진행 쀑인 νŠΈλžœμž­μ…˜μ΄ 있으면 ν•΄λ‹Ή νŠΈλžœμž­μ…˜μ— μ°Έμ—¬
      β €
    • Propagation.REQUIRES_NEW
      ➜ 이미 진행쀑인 νŠΈλžœμž­μ…˜κ³Ό λ¬΄κ΄€ν•˜κ²Œ μƒˆ νŠΈλžœμž­μ…˜ μ‹œμž‘
      ➜ 기쑴에 μ§„ν–‰μ€‘μ΄λ˜ νŠΈλžœμž­μ…˜μ€ μƒˆ νŠΈλžœμž­μ…˜μ΄ μ’…λ£Œλ  λ•ŒκΉŒμ§€ 쀑지
      β €
    • Propagation.MANDATORY
      ➜ 진행쀑인 νŠΈλžœμž­μ…˜μ΄ μ—†μœΌλ©΄ μ˜ˆμ™Έ λ°œμƒ
      β €
    • Propagation.NOT_SUPPORTED
      ➜ νŠΈλžœμž­μ…˜μ„ ν•„μš”λ‘œ ν•˜μ§€ μ•ŠμŒμ„ 의미
      ➜ 진행 쀑인 νŠΈλžœμž­μ…˜μ΄ 있으면 λ©”μ„œλ“œ 싀행이 μ’…λ£Œλ  λ•Œ κΉŒμ§€ 진행쀑인 νŠΈλžœμž­μ…˜μ€ μ€‘μ§€λ˜λ©°, λ©”μ„œλ“œ 싀행이 μ’…λ£Œλ˜λ©΄ νŠΈλžœμž­μ…˜μ„ 계속 진행
      β €
    • Propagation.NEVER
      ➜ νŠΈλžœμž­μ…˜μ„ ν•„μš”λ‘œ ν•˜μ§€ μ•ŠμŒμ„ 의미
      ➜ 진행 쀑인 νŠΈλžœμž­μ…˜μ΄ μ‘΄μž¬ν•  κ²½μš°μ—λŠ” μ˜ˆμ™Έλ₯Ό λ°œμƒ
      β €
      But, μž‘μ—…λ³„λ‘œ νŠΈλžœμž­μ…˜μ„ μƒˆλ‘œ 생성해야 ν•œλ‹€κ±°λ‚˜ νŠΉμ • μž‘μ—…μ—λŠ” νŠΈλžœμž­μ…˜μ„ μ μš©ν•˜μ§€ μ•ŠλŠ” λ“±μ˜ κ²½μš°κ°€ μ•„λ‹ˆλΌλ©΄
      @Transactional μ• λ„ˆν…Œμ΄μ…˜λ§Œ 좔가해도 무방
      β €
      [μ°Έκ³ ] https://docs.spring.io/spring-framework/docs/5.0.x/spring-framework-reference/data-access.html#tx-propagation
  • νŠΈλžœμž­μ…˜ 격리 레벨 (Isolation Level)
    ➜ νŠΈλžœμž­μ…˜μ€ 격리성이 보μž₯λ˜μ–΄μ•Ό 함
    (λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ— 영ν–₯을 주지 μ•Šκ³ , λ…λ¦½μ μœΌλ‘œ μ‹€ν–‰λ˜μ–΄μ•Ό 함)
    β €

    βœ”οΈ Isolation μ• νŠΈλ¦¬λ·°νŠΈ

    • Isolation.DEFAULT
      ➜ λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ μ œκ³΅ν•˜λŠ” κΈ°λ³Έ κ°’
      β €β €
    • Isolation.READ_UNCOMMITTED
      ➜ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ—μ„œ μ»€λ°‹ν•˜μ§€ μ•Šμ€ 데이터λ₯Ό μ½λŠ” 것 ν—ˆμš©
      β €β €
    • Isolation.READ_COMMITTED
      ➜ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ— μ˜ν•΄ μ»€λ°‹λœ 데이터λ₯Ό μ½λŠ” 것 ν—ˆμš©
      β €β €
    • Isolation.REPEATABLE_READ
      ➜ νŠΈλžœμž­μ…˜ λ‚΄μ—μ„œ ν•œ 번 μ‘°νšŒν•œ 데이터λ₯Ό λ°˜λ³΅ν•΄μ„œ μ‘°νšŒν•΄λ„ 같은 데이터가 μ‘°νšŒλ˜λ„λ‘ 함
      β €β €
    • Isolation.SERIALIZABLE
      ➜ λ™μΌν•œ 데이터에 λŒ€ν•΄μ„œ λ™μ‹œμ— 두 개 μ΄μƒμ˜ νŠΈλžœμž­μ…˜μ΄ μˆ˜ν–‰λ˜μ§€ λͺ»ν•˜λ„둝 함
      β €β €β €
      ❗ νŠΈλžœμž­μ…˜μ˜ 격리 λ ˆλ²¨μ€ 일반적으둜 λ°μ΄ν„°λ² μ΄μŠ€λ‚˜ λ°μ΄ν„°μ†ŒμŠ€μ— μ„€μ •λœ 격리 λ ˆλ²¨μ„ λ”°λ₯΄λŠ” 것이 ꢌμž₯

πŸ’‘ 체크 μ˜ˆμ™Έ(checked exeption)λŠ” rollback이 잘 될까?

  • @Transactional μ• λ„ˆν…Œμ΄μ…˜λ§Œ μΆ”κ°€ν•΄μ„œλŠ” rollback이 λ˜μ§€ μ•ŠμŒ
    ( μ˜ˆμ™Έλ₯Ό catch ν•΄μ„œ ν•΄λ‹Ή μ˜ˆμ™Έλ₯Ό 볡ꡬ할지 νšŒν”Όν• μ§€ λ“±μ˜ μ μ ˆν•œ μ˜ˆμ™Έ μ „λž΅μœΌλ‘œ μ²΄ν¬ν•΄μ•Όν•˜κΈ° λ•Œλ¬Έμ— )
    Ex. Exception, SQLException, DataFormatException]
    β €
    ➜ λ³„λ„μ˜ μ˜ˆμ™Έ μ „λž΅μ„ 지 ν•„μš”κ°€ μ—†λ‹€λ©΄,
    @Transactional(rollbackFor = {SQLException.class, DataFormatException.class}) 처럼 ν•΄λ‹Ή 체크 μ˜ˆμ™Έλ₯Ό 직접 μ§€μ •ν•΄μ£Όκ±°λ‚˜
    언체크 μ˜ˆμ™Έ(unchecked exception)둜 κ°μ‹Έμ„œ rollback이 λ™μž‘ν•˜λ„λ‘ ν•  수 있음 !

βœ” 2. AOP 방식

➜ AOP 방식 μ΄μš©ν•˜μ—¬ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ—μ„œ μ•„μ˜ˆ νŠΈλžœμž­μ…˜ 적용 μ½”λ“œ 자체λ₯Ό κ°μΆ”λŠ” 방식

βœ”οΈ AOP 방식 적용 μˆœμ„œ

  1. Config ν΄λž˜μŠ€μ— @Configuration μ• λ„ˆν…Œμ΄μ…˜ μΆ”κ°€ν•˜μ—¬ νŠΈλžœμž­μ…˜ μ μš©μ„ μœ„ν•œ Configuration 클래슀 μ •μ˜

  2. μƒμ„±μžμ— TransactionManager 객체 DI
    β €
    [μ°Έκ³ ] https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/transaction/TransactionManager.html

  3. νŠΈλžœμž­μ…˜ μ–΄λ“œλ°”μ΄μŠ€μš© TransactionInterceptor 빈 등둝
    ➜ TransactionInterceptorλ₯Ό μ΄μš©ν•΄ λŒ€μƒ 클래슀 / μΈν„°νŽ˜μ΄μŠ€μ— νŠΈλžœμž­μ…˜ 경계 μ„€μ • 및 νŠΈλžœμž­μ…˜ μ μš©μ„ ν•  수 있음
    ( TransactionInterceptor νƒ€μž…μ˜ μ–΄λ“œλ°”μ΄μŠ€ λ©”μ„œλ“œ 생성 )
    β €
    [μ°Έκ³ ] https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/transaction/interceptor/TransactionInterceptor.html
    β €
    3-1. NameMatchTransactionAttributeSource 객체 생성
    β €
    [μ°Έκ³ ] https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/transaction/interceptor/NameMatchTransactionAttributeSource.html
    β €
    3-2. 쑰회 λ©”μ„œλ“œλ₯Ό μ œμ™Έν•œ 곡톡 νŠΈλžœμž­μ…˜ μ• νŠΈλ¦¬λ·°νŠΈ1 생성
    β €
    3-3. 쑰회 λ©”μ„œλ“œμ— μ μš©ν•˜κΈ° μœ„ν•œ νŠΈλžœμž­μ…˜ μ• νŠΈλ¦¬λ·°νŠΈ2 생성
    β €
    3-4. νŠΈλžœμž­μ…˜μ„ μ μš©ν•  λ©”μ„œλ“œμ— νŠΈλžœμž­μ…˜ μ• νŠΈλ¦¬λ·°νŠΈ 맀핑
    ➜ μ„€μ •ν•œ νŠΈλžœμž­μ…˜ μ• νŠΈλ¦¬λ·°νŠΈλŠ” Map에 keyλ₯Ό λ©”μ„œλ“œ 이름 νŒ¨ν„΄μœΌλ‘œ μΆ”κ°€ν•˜κ³  각각 νŠΈλžœμž­μ…˜μ˜ μ• νŠΈλ¦¬λ·°νŠΈ μΆ”κ°€
    β €β €
    3-5. νŠΈλžœμž­μ…˜ μ• νŠΈλ¦¬λ·°νŠΈλ₯Ό μΆ”κ°€ν•œ Map 객체λ₯Ό txAttributeSource.setNameMap(Map 이름)으둜 λ„˜κ²¨μ€Œ
    β €
    3-6. TransactionInterceptor 객체 생성 ν›„, TransactionInterceptor의 μƒμ„±μž νŒŒλΌλ―Έν„°λ‘œ transactionManager/txAttributeSource μ „λ‹¬ν•˜μ—¬ 리턴

  4. Advisor 빈 등둝
    β €
    4-1. AspectJExpressionPointcut 객체 생성
    ➜ νŠΈλžœμž­μ…˜ μ–΄λ“œλ°”μ΄μŠ€μΈ TransactionInterceptorλ₯Ό νƒ€κ²Ÿ ν΄λž˜μŠ€μ— μ μš©ν•˜κΈ° μœ„ν•΄ 포인트 컷을 지정
    β €
    4-2. 포인트 μ»· ν‘œν˜„μ‹μœΌλ‘œ ν•΄λ‹Ή 클래슀λ₯Ό νƒ€κ²Ÿ 클래슀둜 지정
    β €
    4-3. DefaultPointcutAdvisor의 μƒμ„±μž νŒŒλΌλ―Έν„°λ‘œ 포인트컷과 μ–΄λ“œλ°”μ΄μŠ€λ₯Ό μ „λ‹¬ν•˜μ—¬ 리턴
    ➜ return new DefaultPointcutAdvisor(pointcut 이름, μ–΄λ“œλ°”μ΄μŠ€ λ©”μ„œλ“œ());


✏️ λΆ„μ‚° νŠΈλžœμž­μ…˜

  • μ„œλ‘œ λ‹€λ₯Έ λ°μ΄ν„°μ†ŒμŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” ν•œ 개 μ΄μƒμ˜ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜μœΌλ‘œ λ¬Άμ–΄μ„œ μ²˜λ¦¬ν•΄μ•Ό ν•  경우 μ‚¬μš©

( H2 인메λͺ¨λ¦¬ DB의 경우 λΆ„μ‚° νŠΈλžœμž­μ…˜μ΄ μ •μƒμ μœΌλ‘œ λ™μž‘ν•˜μ§€ μ•ŠκΈ°λ•Œλ¬Έμ— μ‹€μŠ΅μ—μ„œλŠ” MySQL λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ‚¬μš© ! )

  • ❗ μ‚¬μš©μ„ μœ„ν•΄μ„œλŠ” build.gradle 파일의 dependencies에 μ•„λž˜μ™€ 같은 μ˜μ‘΄μ„± 좔가해야함
    implementation 'mysql:mysql-connector-java' // MySQL 컀λ„₯ν„° μΆ”κ°€
    implementation 'org.springframework.boot:spring-boot-starter-jta-atomikos'
    //  λΆ„μ‚° νŠΈλžœμž­μ…˜ μ˜€ν”ˆ μ†ŒμŠ€μΈ atomikos μΆ”κ°€
  • μ„œλΈ”λ¦Ώ μ»¨ν…Œμ΄λ„ˆ ν™˜κ²½μ—μ„œ λΆ„μ‚° νŠΈλžœμž­μ…˜μ„ μ μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ³„λ„μ˜ JTA νŠΈλžœμž­μ…˜ λ§€λ‹ˆμ €κ°€ ν•„μš”
    ➜ μš°λ¦¬λŠ” κ°€μž₯ 많이 μ‚¬μš©ν•˜λŠ” μ˜€ν”ˆ μ†ŒμŠ€ JTA νŠΈλžœμž­μ…˜ λ§€λ‹ˆμ € ν”Œλž«νΌμΈ Atomikos μ‚¬μš©

  • ❗ μ•„λž˜μ™€ 같은 λ³„λ„μ˜ μΆ”κ°€ 섀정이 ν•„μš”
    ( 둜컬 νŠΈλžœμž­μ…˜μ˜ 경우, Spring Boot의 μžλ™ ꡬ성을 μ΄μš©ν–ˆκΈ°λ•Œλ¬Έμ— κ°œλ°œμžκ°€ ν•΄μ•Ό ν•˜λŠ” 일이 λ³„λ‘œ μ—†μ—ˆμŒ )

  1. ν•΄λ‹Ή λ°μ΄ν„°λ² μ΄μŠ€μ— λ§žλŠ” λ°μ΄ν„°μ†ŒμŠ€(Datasource) 생성

  2. 각 λ°μ΄ν„°μ†ŒμŠ€λ₯Ό JPA의 EntityManagerκ°€ μΈμ‹ν•˜λ„λ‘ μ„€μ •

  3. JTA TransactionManager μ„€μ •

  4. JTA Platform μ„€μ •

βœ” 백업을 μœ„ν•΄ νŠΉμ • λ°μ΄ν„°λ² μ΄μŠ€μ˜ 데이터λ₯Ό λ‹€λ₯Έ λ°μ΄ν„°λ² μ΄μŠ€λ‘œ λ³΅μ œν•˜λŠ” 방법

  • 같은 μ’…λ₯˜μ˜ λ°μ΄ν„°λ² μ΄μŠ€μΌ 경우
    ➜ 볡제(Replication) κΈ°λŠ₯ 이용
    β €β €
  • λ‹€λ₯Έ μ’…λ₯˜μ˜ λ°μ΄ν„°λ² μ΄μŠ€μΌ 경우
    ➜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μŠ€μΌ€μ₯΄λ§ κΈ°λŠ₯ 이용
    ➜ 이런 κΈ°λŠ₯듀을 기본적으둜 μ§€μ›ν•˜λŠ” Apache NiFi 같은 μ˜€ν”ˆ μ†ŒμŠ€ κΈ°μˆ λ„ μ‚¬μš© κ°€λŠ₯

βœ” 동기적 vs 비동기적

  • 동기적
    ➜ νŠΉμ • μ½”λ“œλ₯Ό μˆ˜ν–‰ μ™„λ£Œν•œ 이후, μ•„λž˜μ€„μ˜ μ½”λ“œ μˆ˜ν–‰
    ( μ½”λ“œμ˜ μ°¨λ‘€λŒ€λ‘œ μ™„λ£Œλ¨ )

  • 비동기적
    ➜ νŠΉμ • μ½”λ“œλ₯Ό μˆ˜ν–‰ν•˜λŠ” 도쀑에 μ•„λž˜λ‘œ 계속 λ‚΄λ €κ°€λ©° μˆ˜ν–‰
    ( μ‹œμž‘λ§Œ μ°¨λ‘€λ‘œ ν•˜κ³  μ½”λ“œμ˜ μˆ˜ν–‰ μ‹œκ°„μ— 따라 μ™„λ£Œλ˜λŠ” μ½”λ“œμ˜ μˆœμ„œκ°€ 닀름 )

[μ°Έκ³ ] https://wakestand.tistory.com/235


😜 μ‹€μŠ΅

  • projects 폴더 λ‚΄μ˜ be-template-tx ( νŠΈλžœμž­μ…˜ )
  • projects 폴더 λ‚΄μ˜ be-template-distributed-tx ( λΆ„μ‚° νŠΈλžœμž­μ…˜ )
  • git 폴더 λ‚΄μ˜ be-homework-tx

[과제 참고]
https://www.baeldung.com/spring-events#publisher
https://sabarada.tistory.com/184
https://engkimbs.tistory.com/718

........................................................................................................................................................................................................
νŠΈλžœμž­μ…˜μ΄ μ–΄λ–»κ²Œ μ μš©λ˜λŠ”μ§€ 둜그 ν™•μΈν•˜κ³  μ‹Άλ‹€λ©΄,
applictaion.yml νŒŒμΌμ— μ•„λž˜ μ½”λ“œ μΆ”κ°€ν•˜κΈ° !

logging:
  level:
    org:
      springframework:
        orm:
          jpa: DEBUG

μœ„μ™€ 같이 둜그 λ ˆλ²¨μ„ DEBUG 레벨둜 μ„€μ •ν•˜λ©΄ JPA λ‚΄λΆ€μ—μ„œ DEBUG 둜그 λ ˆλ²¨μ„ μ§€μ •ν•œ λΆ€λΆ„μ˜ 둜그 확인 κ°€λŠ₯ !

그리고 컀밋 둜그λ₯Ό μ‚΄νŽ΄λ³΄κΈ° μœ„ν•΄ 포슀트맨으둜 member의 값을 postν•œ ν›„ 둜그λ₯Ό 보면,

⬆️ νŠΈλžœμž­μ…˜μ„ μ‚¬μš©ν•˜κΈ° μœ„ν•΄ JPA의 EntityManagerλ₯Ό μ—΄κ³ μžˆλŠ” 것을 μ•Œ 수 있음

⬆️ MemberService의 createMember() λ©”μ„œλ“œκ°€ ν˜ΈμΆœλ˜λ©΄μ„œ μƒˆλ‘œμš΄ νŠΈλžœμž­μ…˜μ΄ μƒμ„±λ˜κ³  μžˆμŒμ„ μ•Œ 수 있음

⬆️ νŠΈλžœμž­μ…˜μ—μ„œ commit이 μΌμ–΄λ‚˜κ³  νŠΈλžœμž­μ…˜μ΄ μ’…λ£Œλ˜μ–΄ JPA의 EntityManagerλ₯Ό μ’…λ£Œν•˜κ³  μžˆμŒμ„ μ•Œ 수 있음

그리고 λ‘€λ°± 둜그λ₯Ό μ‚΄νŽ΄λ³΄κΈ° μœ„ν•΄ MemberService의 creatMember() λ©”μ„œλ“œμ˜ μ½”λ“œλ₯Ό μ•„λž˜μ™€ 같이 λ°”κΎΈκ³ 

포슀트맨으둜 member의 값을 postν•œ ν›„ 둜그λ₯Ό 보면,

⬆️ νŠΈλžœμž­μ…˜μ—μ„œ μ—λŸ¬κ°€ λ‚˜νƒ€λ‚˜ rollback이 μ •μƒμ μœΌλ‘œ μž‘λ™ν•˜λŠ” 것을 μ•Œ 수 있음
( 데이터 ν…Œμ΄λΈ”μ—μ„œ 정보가 듀어가지 μ•ŠμŒ ! )

........................................................................................................................................................................................................

μ½˜μ†”μ°½μ˜ λ‘œκ·Έλ“€μ„ 보기 νŽΈν•˜κ²Œ 색상을 λ°”κΎΈκ³  μ‹Άλ‹€λ©΄,
applictaion.yml νŒŒμΌμ— μ•„λž˜ μ½”λ“œ μΆ”κ°€ν•˜κΈ° !

spring: //이미 μž‘μ„±λ˜μ–΄ 있음
  output: //μΆ”κ°€
    ansi: //μΆ”κ°€
      enabled: always //μΆ”κ°€

그러면 μ•„λž˜μ™€ 같이 μ•Œλ‘λ‹¬λ‘ν•œ λ‘œκ·Έλ“€μ„ λ³Ό 수 μžˆλ‹€ !


🌈 λŠλ‚€μ 

κ·Έλž˜λ„ λ‹€λ₯Έ 챕터에 λΉ„ν•΄ νŠΈλžœμž­μ…˜ 뢀뢄은 κ·Έλž˜λ„ κ°„λ‹¨ν•˜κ²Œ ν•œ 것 κ°™λ‹€ !
μ‹€μŠ΅ κ³Όμ œκ°€ 쑰금 μ–΄λ ΅κΈ΄ ν–ˆμ§€λ§Œ 이해λ₯Ό ν•˜λ‹ˆ 쉬웠고 κ΅¬ν˜„ν•  λ‚΄μš©λ„ μ μ–΄μ„œ μ’‹μ•˜λ‹€ γ…Žγ…Ž
λ‹€μŒ 챕터도 ν™”μ΄νŒ…

0개의 λŒ“κΈ€