# νŠΈλžœμž­μ…˜ AOP @Transactional의 μ˜΅μ…˜
Study Repository

νŠΈλžœμž­μ…˜ AOP @Transactional의 μ˜΅μ…˜

by rlaehddnd0422

μŠ€ν”„λ§ νŠΈλžœμž­μ…˜μ€ λ‹€μ–‘ν•œ μ˜΅μ…˜μ„ μ§€μ›ν•©λ‹ˆλ‹€. μ˜΅μ…˜μ— 어떀것듀이 μžˆλŠ”μ§€ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

value μ˜΅μ…˜

valueμ˜΅μ…˜μ€ νŠΈλžœμž­μ…˜μ˜ 이름을 μ§€μ •ν•˜λŠ” μ˜΅μ…˜μž…λ‹ˆλ‹€. 이 μ˜΅μ…˜μ„ 톡해 νŠΈλžœμž­μ…˜μ˜ 이름을 μ§€μ •ν•˜λ©΄, ν•΄λ‹Ή μ΄λ¦„μœΌλ‘œ νŠΈλžœμž­μ…˜μ„ 식별할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

value μ˜΅μ…˜μ€ λ‹€μŒκ³Ό 같이 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • @Transactional(value = "txName"): txName으둜 μ§€μ •λœ μ΄λ¦„μ˜ νŠΈλžœμž­μ…˜μ„ μ‚¬μš©ν•©λ‹ˆλ‹€.
  • @Transactional("txName"): value = λ₯Ό μƒλž΅ν•˜κ³ , 직접 txName으둜 νŠΈλžœμž­μ…˜ 이름을 지정할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • @Transactional(value = { "txName1", "txName2" }): μ—¬λŸ¬ 개의 νŠΈλžœμž­μ…˜ 이름을 λ°°μ—΄ ν˜•νƒœλ‘œ 지정할 수 μžˆμŠ΅λ‹ˆλ‹€.

νŠΈλžœμž­μ…˜ 이름은 보톡 νŠΈλžœμž­μ…˜ λ§€λ‹ˆμ €μ—μ„œ μ‚¬μš©λ©λ‹ˆλ‹€. νŠΈλžœμž­μ…˜ λ§€λ‹ˆμ €λŠ” νŠΈλžœμž­μ…˜μ˜ 이름을 μ‚¬μš©ν•˜μ—¬ μ—¬λŸ¬ 개의 νŠΈλžœμž­μ…˜μ„ κ΅¬λΆ„ν•˜κ³ , 각각의 νŠΈλžœμž­μ…˜μ„ κ΄€λ¦¬ν•©λ‹ˆλ‹€. μ΄λ•Œ, 같은 μ΄λ¦„μœΌλ‘œ μ§€μ •λœ νŠΈλžœμž­μ…˜μ€ 같은 νŠΈλžœμž­μ…˜μœΌλ‘œ μ·¨κΈ‰λ©λ‹ˆλ‹€.

 

νŠΈλžœμž­μ…˜ 이름을 μ‚¬μš©ν•˜μ—¬ νŠΈλžœμž­μ…˜μ„ κ΄€λ¦¬ν•˜λŠ” 것은, 닀쀑 데이터 μ†ŒμŠ€λ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜, λΆ„μ‚° ν™˜κ²½μ—μ„œ μ—¬λŸ¬ 개의 μ„œλ²„μ—μ„œ μž‘μ—…μ„ μˆ˜ν–‰ν•  λ•Œ μœ μš©ν•©λ‹ˆλ‹€. μ΄λ•Œ, νŠΈλžœμž­μ…˜ 이름을 μ‚¬μš©ν•˜μ—¬ μž‘μ—…μ„ μ‹λ³„ν•˜λ©΄, λ‹€λ₯Έ μ„œλ²„μ—μ„œλ„ λ™μΌν•œ νŠΈλžœμž­μ…˜μ„ μ‚¬μš©ν•˜μ—¬ 데이터λ₯Ό 일관성 있게 관리할 수 μžˆμŠ΅λ‹ˆλ‹€.


rollbackFor / norollbackFor μ˜΅μ…˜

νŠΈλžœμž­μ…˜ μˆ˜ν–‰μ€‘ μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ μ˜ˆμ™Έμ˜ μ’…λ₯˜μ— 따라 처리 방법이 λ‹¬λΌμ§‘λ‹ˆλ‹€.

  • νŠΈλžœμž­μ…˜ μˆ˜ν–‰ 도쀑 체크 μ˜ˆμ™Έκ°€ λ°œμƒν•˜λŠ” κ²½μš°μ—λŠ” μ»€λ°‹ν•©λ‹ˆλ‹€.
  • νŠΈλžœμž­μ…˜ μˆ˜ν–‰ 도쀑 언체크 μ˜ˆμ™Έ(RuntimeException 포함 ν•˜μœ„ μ˜ˆμ™Έ)이 λ°œμƒν•˜λŠ” κ²½μš°μ—λŠ” λ‘€λ°±ν•©λ‹ˆλ‹€.

ν•˜μ§€λ§Œ rollbackForμ˜΅μ…˜μ„ μ‚¬μš©ν•˜λ©΄ μ²΄ν¬μ˜ˆμ™Έμ˜ κ²½μš°μ—λ„ λ‘€λ°±ν•˜λ„λ‘ μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

@Transactional(rollbackFor = MyCheckedException.class)둜 μ„€μ •ν–ˆλ‹€κ³  κ°€μ •ν•΄λ΄…μ‹œλ‹€.

 

이 경우 ν•΄λ‹Ή λ©”μ†Œλ“œκ°€ νŠΈλžœμž­μ…˜ μˆ˜ν–‰ 도쀑 μ§€μ •ν•œ μ˜ˆμ™ΈμΈ MyCheckedExeption이 λ°œμƒν•œλ‹€λ©΄, λ‘€λ°±ν•˜λ„λ‘ μ„€μ •ν•©λ‹ˆλ‹€.

norollBackFor μ˜΅μ…˜μ€ rollbackForμ˜΅μ…˜μ˜ λ°˜λŒ€λ‘œ μ§€μ •ν•œ 언체크 μ˜ˆμ™Έκ°€ ν„°μ§ˆ 경우, μ»€λ°‹ν•˜λ„λ‘ μ§€μ‹œν•©λ‹ˆλ‹€.


κ·Έλ ‡λ‹€λ©΄ μ™œ μŠ€ν”„λ§μ€ μ²΄ν¬μ˜ˆμ™ΈλŠ” μ»€λ°‹ν•˜κ³ , 언체크 μ˜ˆμ™ΈλŠ” λ‘€λ°±ν• κΉŒμš”?   

 

이 μ§ˆλ¬Έμ„ λ‹΅ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ²΄ν¬μ˜ˆμ™Έμ™€ μ–Έμ²΄ν¬μ˜ˆμ™Έμ— λŒ€ν•œ 이해가 μ€‘μš”ν•©λ‹ˆλ‹€.

 

  • 체크 μ˜ˆμ™ΈλŠ” μ˜ˆμƒ κ°€λŠ₯ν•œ μ˜ˆμ™Έ 상황을 μ²˜λ¦¬ν•˜λŠ” 데 μ‚¬μš©λ˜λ©°, ν˜ΈμΆœν•˜λŠ” λ©”μ†Œλ“œμ—μ„œ μ˜ˆμ™Έ 처리λ₯Ό κ°•μ œν•©λ‹ˆλ‹€.

λ”°λΌμ„œ ν•΄λ‹Ή μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ ν˜ΈμΆœν•œ μͺ½μ—μ„œ μ˜ˆμ™Έ 처리λ₯Ό ν•΄μ•Ό ν•˜λ©°, 이둜 인해 λ©”μ†Œλ“œ 호좜 μŠ€νƒμ΄ μœ μ§€λ©λ‹ˆλ‹€.

μ΄λŸ¬ν•œ νŠΉμ„± λ•Œλ¬Έμ— 체크 μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ ν•΄λ‹Ή λ©”μ†Œλ“œμ—μ„œλŠ” μ˜ˆμ™Έ 처리λ₯Ό ν•΄κ²°ν•  수 μ—†μœΌλ―€λ‘œ, μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ λ©”μ†Œλ“œκ°€ 호좜된 곳으둜 μ˜ˆμ™Έλ₯Ό μ „νŒŒν•΄μ•Ό ν•©λ‹ˆλ‹€. λ§Œμ•½ ν•΄λ‹Ή μ˜ˆμ™Έκ°€ νŠΈλžœμž­μ…˜ 처리 쀑 λ°œμƒν•œλ‹€λ©΄, 둀백을 ν•΄μ•Ό ν•©λ‹ˆλ‹€.

 

  • λ°˜λ©΄μ— 언체크(λŸ°νƒ€μž„) μ˜ˆμ™ΈλŠ” ν˜ΈμΆœν•˜λŠ” λ©”μ†Œλ“œμ—μ„œ μ˜ˆμ™Έ 처리λ₯Ό κ°•μ œν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ ν•΄λ‹Ή μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜λŠ” μ½”λ“œκ°€ μ—†λ‹€λ©΄ 호좜 μŠ€νƒμ„ 타고 μƒμœ„ ν˜ΈμΆœμžκΉŒμ§€ μ „νŒŒλ˜λ©°, μŠ€ν”„λ§μ—μ„œλŠ” ν•΄λ‹Ή μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ νŠΈλžœμž­μ…˜μ„ λ‘€λ°±ν•˜μ—¬ μ•ˆμ •μ„±μ„ 보μž₯ν•©λ‹ˆλ‹€.

 

λ˜ν•œ 언체크 μ˜ˆμ™ΈλŠ” μ‹œμŠ€ν…œμ΄ λΆˆμ•ˆμ •ν•œ μƒνƒœκ°€ λ˜λŠ” κ²½μš°κ°€ 많기 λ•Œλ¬Έμ—, 둀백을 톡해 μ‹œμŠ€ν…œ μ•ˆμ •μ„±μ„ μœ μ§€ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.

λ”°λΌμ„œ μŠ€ν”„λ§μ—μ„œλŠ” 체크 μ˜ˆμ™Έμ™€ 언체크 μ˜ˆμ™Έλ₯Ό κ΅¬λΆ„ν•˜μ—¬ νŠΈλžœμž­μ…˜ 처리λ₯Ό λ‹€λ₯΄κ²Œ ν•˜μ—¬ μ•ˆμ •μ„±μ„ 보μž₯ν•©λ‹ˆλ‹€.

 

λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ—μ„œ λ°œμƒν•˜λŠ” μ˜ˆμ™Έμ˜ κ²½μš°μ—λŠ” μ„œλ²„μΈ‘μ΄ μ•„λ‹Œ ν΄λΌμ΄μ–ΈνŠΈκ°€ 잘λͺ»ν•΄μ„œ λ°œμƒν•˜λŠ” μ˜ˆμ™Έμž…λ‹ˆλ‹€. 이 λ•Œ 체크 μ˜ˆμ™Έλ₯Ό μ‚¬μš©ν•΄μ„œ ν΄λΌμ΄μ–ΈνŠΈκ°€ μš”μ²­ν•œ νŠΈλžœμž­μ…˜μ€ μ»€λ°‹ν•˜κ³ , μ»€λ°‹ν•œ 이후에 ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ μΆ”κ°€ μš”μ²­μ‚¬ν•­μ„ μ‘λ‹΅ν•˜λŠ” ν˜•μ‹μœΌλ‘œ μ²˜λ¦¬ν•©λ‹ˆλ‹€.

isolation μ˜΅μ…˜

νŠΈλžœμž­μ…˜ 격리 μˆ˜μ€€μ„ 지정할 수 μžˆμŠ΅λ‹ˆλ‹€. κ°œλ°œμžκ°€ νŠΈλžœμž­μ…˜ κ²©λ¦¬μˆ˜μ€€μ„ μ§€μ •ν•˜λŠ” κ²½μš°λŠ” λ“œλ­…λ‹ˆλ‹€.

νŠΈλžœμž­μ…˜ κ²©λ¦¬μˆ˜μ€€μ— λŒ€ν•΄μ„œλŠ” μ•„λž˜ 글을 μ°Έκ³ ν•΄μ£Όμ„Έμš”.

 

νŠΈλžœμž­μ…˜(Transaction)μ΄λž€?

νŠΈλžœμž­μ…˜μ΄λž€? νŠΈλžœμž­μ…˜μ΄λž€ λ°μ΄ν„°λ² μ΄μŠ€μ˜ μƒνƒœλ₯Ό λ³€ν™”μ‹œν‚€λŠ” ν•˜λ‚˜μ˜ 논리적 κΈ°λŠ₯을 μˆ˜ν–‰ν•˜κΈ° μœ„ν•œ μž‘μ—…μ˜ λ‹¨μœ„ λ˜λŠ” ν•œκΊΌλ²ˆμ— λͺ¨λ‘ μˆ˜ν–‰λ˜μ–΄μ•Ό ν•  일련의 연산듀을 μ˜λ―Έν•©λ‹ˆλ‹€. νŠΈλžœμž­μ…˜μ˜

rlaehddnd0422.tistory.com


timeout μ˜΅μ…˜

νŠΈλžœμž­μ…˜ μˆ˜ν–‰μ‹œκ°„μ— λŒ€ν•œ νƒ€μž„μ•„μ›ƒμ„ μ΄ˆλ‹¨μœ„λ‘œ 지정할 수 μžˆμŠ΅λ‹ˆλ‹€. κΈ°λ³Έ 값은 νŠΈλžœμž­μ…˜ μ‹œμŠ€ν…œμ˜ νƒ€μž„μ•„μ›ƒ μ‚¬μš©.


label μ˜΅μ…˜ 

νŠΈλžœμž­μ…˜ μ–΄λ…Έν…Œμ΄μ…˜μ— μžˆλŠ” 값을 직접 μ½μ–΄μ„œ μ–΄λ–€ λ™μž‘μ„ ν•˜κ³  싢을 λ•Œ μ‚¬μš©ν•  수 μžˆλŠ”λ°, 일반적으둠 μ‚¬μš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.


readOnly μ˜΅μ…˜

νŠΈλžœμž­μ…˜μ€ λ””ν΄νŠΈλ‘œ 읽기, μ“°κΈ°κ°€ λͺ¨λ‘ κ°€λŠ₯ν•œ νŠΈλžœμž­μ…˜μ΄ μƒμ„±λ©λ‹ˆλ‹€. 

 

ν•˜μ§€λ©΄ 이 μ˜΅μ…˜μ„ true둜 μ„€μ •ν•˜κ²Œ 되면 ν•΄λ‹Ή νŠΈλžœμž­μ…˜μ€ 읽기 μ „μš© νŠΈλžœμž­μ…˜μ΄ λ˜μ–΄, μ‚½μž…, μ‚­μ œ, μˆ˜μ •μ΄ μ•ˆλ˜κ³  읽기 κΈ°λŠ₯만 μž‘λ™ν•©λ‹ˆλ‹€. λ§Œμ•½ 읽기 μ™Έμ˜ μž‘μ—…μ΄ ν•΄λ‹Ή νŠΈλžœμž­μ…˜μ—μ„œ μˆ˜ν–‰λ˜λ©΄, 언체크 μ˜ˆμ™Έκ°€ λ°œμƒν•˜κΈ° λ•Œλ¬Έμ— νŠΈλžœμž­μ…˜μ΄ rollback λ©λ‹ˆλ‹€.

 

@Transactional의 readOnly μ˜΅μ…˜μ€ 주둜 λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 읽기 μž‘μ—…λ§Œ ν•„μš”ν•œ κ²½μš°μ— μ‚¬μš©λ©λ‹ˆλ‹€.

λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 읽기 μž‘μ—…λ§Œ ν•„μš”ν•œ κ²½μš°μ—λŠ” μ“°κΈ° μž‘μ—…μ΄ μ—†μœΌλ―€λ‘œ, ν•΄λ‹Ή νŠΈλžœμž­μ…˜μ„ 읽기 μ „μš©μœΌλ‘œ μ„€μ •ν•˜μ—¬ μ„±λŠ₯을 μ΅œμ ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.  readOnly μ˜΅μ…˜μ„ μ‚¬μš©ν•˜λ©΄, νŠΈλžœμž­μ…˜μ—μ„œ 데이터λ₯Ό μ½λŠ” λ™μ•ˆμ—λ§Œ 읽기 락을 κ±Έκ³ , μ“°κΈ° μž‘μ—…μ€ ν—ˆμš©ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ λΆˆν•„μš”ν•œ λ°λ“œλ½κ³Ό μΆ©λŒμ„ 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€.
λ˜ν•œ, readOnly μ˜΅μ…˜μ„ μ‚¬μš©ν•˜λ©΄ ν•΄λ‹Ή νŠΈλžœμž­μ…˜μ—μ„œ 변경사항이 λ°œμƒν•˜μ§€ μ•ŠμœΌλ―€λ‘œ, 둀백을 μˆ˜ν–‰ν•  ν•„μš”κ°€ μ—†μ–΄μ„œ μ„±λŠ₯상 이점을 κ°€μ§‘λ‹ˆλ‹€.

 

λ”°λΌμ„œ, λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 읽기 μž‘μ—…λ§Œ ν•„μš”ν•œ κ²½μš°μ—λŠ” readOnly μ˜΅μ…˜μ„ μ‚¬μš©ν•˜μ—¬ μ„±λŠ₯ μ΅œμ ν™”λ₯Ό μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, Spring MVC μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” 읽기 μž‘μ—…μ„ μœ„ν•œ Controller λ©”μ†Œλ“œμ—μ„œ readOnly μ˜΅μ…˜μ„ μ‚¬μš©ν•˜μ—¬ μ„±λŠ₯을 μ΅œμ ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


<정리>

  • νŠΈλžœμž­μ…˜ AOP @Transactional의 μ˜΅μ…˜λ“€μ— λŒ€ν•΄ μ•Œμ•„λ³΄μ•˜μŠ΅λ‹ˆλ‹€.
  • 언체크 μ˜ˆμ™Έμ™€ 체크 μ˜ˆμ™Έμ— λ”°λ₯Έ νŠΈλžœμž­μ…˜ 컀밋/λ‘€λ°± μ—¬λΆ€λ₯Ό 잘 μ•Œμ•„λ‘κ³ , 이λ₯Ό λ°”νƒ•μœΌλ‘œ μ–΄λ–€ κ²½μš°μ— 언체크 μ˜ˆμ™Έλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•˜κ³ , 체크 μ˜ˆμ™Έλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•  지 μ•Œμ•„ λ‘‘μ‹œλ‹€.

<참고자료>

 

μŠ€ν”„λ§ DB 2편 - 데이터 μ ‘κ·Ό ν™œμš© 기술 - μΈν”„λŸ° | κ°•μ˜

λ°±μ—”λ“œ κ°œλ°œμ— ν•„μš”ν•œ DB 데이터 μ ‘κ·Ό κΈ°μˆ μ„ ν™œμš©ν•˜κ³ , μ™„μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μŠ€ν”„λ§ DB μ ‘κ·Ό 기술의 원리와 ꡬ쑰λ₯Ό μ΄ν•΄ν•˜κ³ , 더 κΉŠμ΄μžˆλŠ” λ°±μ—”λ“œ 개발자둜 μ„±μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€., - κ°•μ˜ μ†Œκ°œ | 인

www.inflearn.com

 

 

 

 

 

 

λΈ”λ‘œκ·Έμ˜ 정보

Study Repository

rlaehddnd0422

ν™œλ™ν•˜κΈ°