λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
  • μž₯원읡 κΈ°μˆ λΈ”λ‘œκ·Έ
πŸ’Š Java & Kotlin & Spring/- spring framework +

[Spring Framework] AOP에 λŒ€ν•œ μš©μ–΄λ“€κ³Ό κΈ°λ³Έ 컨셉에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μž.

by Wonit 2020. 9. 5.

μ˜€λŠ˜μ€ Spring의 핡심 κΈ°λŠ₯쀑 ν•˜λ‚˜μΈ AOP (Aspect Oriented Programming)에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μž.

AOP

사전적 의미인 AOPλŠ” νš‘λ‹¨ κ΄€μ‹¬μ‚¬μ˜ 뢄리λ₯Ό ν—ˆμš©ν•¨μœΌλ‘œ λͺ¨λ“ˆμ„±μ„ μ¦κ°€μ‹œν‚€λŠ” 것이 λͺ©μ μΈ ν”„λ‘œκ·Έλž˜λ°μ˜ νŒ¨λŸ¬λ‹€μž„μ΄λ‹€.

쒅단 κ΄€μ‹¬μ‚¬λž€?

ν•˜λ‚˜μ˜ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직이 μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ 둜직이 μ’…λ‹¨μ˜ κ°œλ…μœΌλ‘œ μ‘΄μž¬ν•˜λŠ” 것을 λœ»ν•œλ‹€.
예λ₯Ό λ“€μ–΄ νšŒμ›κ°€μž…μ„ μœ„ν•΄ ν•„μš”ν•œ λ‘œμ§λ“€μ΄ νšŒμ›κ°€μž…μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•œ 관심사라고 ν•  수 μžˆλ”°.

ν•˜μ§€λ§Œ μ—¬κΈ°μ„œ κ°œλ°œμžλ“€μ΄ κ°€μž₯ μ‹«μ–΄ν•˜λŠ” 쀑볡이 λ°œμƒν•  ν™•λ₯ μ΄ 높아진닀.
μš°λ¦¬κ°€ DB Connection에 κ΄€ν•΄μ„œ CRUDλ₯Ό μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄μ„œ λͺ¨λ“  λ©”μ„œλ“œμ— Connection c의 μ½”λ“œκ°€ 계속 μ€‘λ³΅λ˜λŠ” ν˜„μƒμ΄ λ°œμƒν•œλ‹€.

νš‘λ‹¨ κ΄€μ‹¬μ‚¬λž€?

ν•˜μ§€λ§Œ νš‘λ‹¨ κ΄€μ‹¬μ‚¬λž€ μ—¬λŸ¬ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직이 μˆ˜ν–‰λ  λ•Œ μ„œλ‘œ μ€‘λ³΅λ˜λŠ” 둜직이 μ‘΄μž¬ν•˜λŠ”μ§€μ— λŒ€ν•œ 관심사이닀.
μœ„μ—μ„œ 말 ν–ˆλ“―μ΄ DB Connection에 κ΄€ν•΄ CRUDλ₯Ό μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄μ„œ λͺ¨λ“  λ©”μ„œλ“œμ— μ‘΄μž¬ν•˜λŠ” Connectionκ΄€λ ¨ λ‘œμ§μ„ ν•˜λ‚˜μ˜ getConnection()λ©”μ„œλ“œλ‘œ λ§Œλ“€μ–΄μ„œ ν˜ΈμΆœν•˜λŠ” ν˜•νƒœλ‘œ 관심사λ₯Ό λΆ„λ¦¬μ‹œν‚¬ 수 μžˆλ‹€.

κ·Έλž˜μ„œ 결둠은 AOPλŠ” νš‘λ‹¨ 관심사λ₯Ό λͺ¨λ“ˆλ‘œμ¨ μ‚¬μš©ν•  수 있게 ν•˜λŠ” κ°œλ…μΈ 것이닀.

AOPμ—λŠ” κΈ°λŠ₯을 두 κ°€μ§€λ‘œ λ‚˜λˆ μ„œ μƒκ°ν–ˆλŠ”λ°,

  • 핡심 κΈ°λŠ₯ => 핡심 κΈ°λŠ₯은 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ ν¬ν•¨ν•˜λŠ” κΈ°λŠ₯을 λœ»ν•œλ‹€.
  • λΆ€κ°€ κΈ°λŠ₯ => λΆ€κ°€κΈ°λŠ₯은 핡심 κΈ°λŠ₯을 λ„μ™€μ£ΌλŠ” 뢀가적인 κΈ°λŠ₯을 λœ»ν•œλ‹€. (λ‘œκΉ…, λ³΄μ•ˆ)

이제 AOP의 μ •μ˜λ₯Ό 쑰금 더 λ³΄μ™„ν•˜μžλ©΄, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œμ˜ κ΄€μ‹¬μ‚¬μ˜ 뢄리가 이루어져 λΆ€κ°€ κΈ°λŠ₯을 AspectλΌλŠ” λͺ¨λ“ˆ ν˜•νƒœλ‘œ λ§Œλ“€μ–΄μ„œ μ„€κ³„ν•˜κ³  κ°œλ°œν•˜λŠ” 방법을 λœ»ν•œλ‹€.

μš°λ¦¬κ°€ AOPλ₯Ό μ΄ν•΄ν•˜κΈ° μœ„ν•΄μ„œ λ‹€μ–‘ν•œ μš©μ–΄μ— λŒ€ν•΄μ„œ λ¨Όμ € μΆ©λΆ„νžˆ ν•™μŠ΅ν•˜κ³  μ§„ν–‰λ˜μ–΄μ•Ό ν•  것 κ°™λ‹€.

AOP의 μš©μ–΄

AOPμ—λŠ” λ§Žμ€ μš©μ–΄λ“€μ΄ μ‘΄μž¬ν•œλ‹€.

  • 핡심 κΈ°λŠ₯
  • λΆ€κ°€ κΈ°λŠ₯
  • target
  • advice
  • join point
  • point cut
  • aspect
  • advisor
  • weaving

μš©μ–΄λ₯Ό ν•˜λ‚˜μ”© μ•Œμ•„λ³΄κ³  그림을 톡해 ν•˜λ‚˜μ˜ 흐름을 μ½μ–΄λ³΄μž.

 

Target

핡심기λŠ₯을 λ‹΄κ³  μžˆλŠ” λͺ¨λ“ˆλ‘œ, λΆ€κ°€κΈ°λŠ₯을 λΆ€μ—¬ν•  λŒ€μƒμ΄ λœλ‹€.

Advice

νƒ€κ²Ÿμ— μ œκ³΅ν•  λΆ€κ°€κΈ°λŠ₯을 λ‹΄κ³  μžˆλŠ” λͺ¨λ“ˆ

Join Point

Adviceκ°€ 적용될 수 μžˆλŠ” μœ„μΉ˜
타겍 객체가 κ΅¬ν˜„ν•œ μΈν„°νŽ˜μ΄μŠ€μ˜ λͺ¨λ“  λ©”μ„œλ“œλŠ” Join Pointκ°€ 될 수 있음

PointCut

μ–΄λ“œλ°”μ΄μŠ€λ₯Ό μ μš©ν•  νƒ€κ²Ÿμ˜ λ©”μ„œλ“œλ₯Ό μ„ λ³„ν•˜λŠ” μ •κ·œν‘œν˜„μ‹
ν‘œν˜„μ‹μ€ execution으둜 μ‹œμž‘ν•˜κ³ , λ©”μ„œλ“œμ˜ Signatureλ₯Ό λΉ„κ΅ν•˜λŠ” 방식

Aspect

AOP의 κΈ°λ³Έ λͺ¨λ“ˆ
싱글톀 ν˜•νƒœμ˜ 객체둜 쑴재

Advisor

μ–΄λ“œλ°”μ΄μŠ€ + 포인트컷
Spring AOPμ—μ„œλ§Œ μ‚¬μš©ν•˜λŠ” νŠΉλ³„ν•œ μš©μ–΄

Weaving

포인트 컷에 μ˜ν•΄μ„œ κ²°μ •λœ νƒ€κ²Ÿμ˜ 쑰인 ν¬μΈνŠΈμ— λΆ€κ°€κΈ°λŠ₯(μ–΄λ“œλ°”μ΄μŠ€)λ₯Ό μ‚½μž…ν•˜λŠ” κ³Όμ •
AOPκ°€ 핡심기λŠ₯(νƒ€κ²Ÿ)에 영ν–₯을 주지 μ•ŠμœΌλ©΄μ„œ ν•„μš”ν•œ μ–΄λ“œλ°”μ΄μŠ€λ₯Ό μΆ”κ°€ν•  수 μžˆλ„λ‘ ν•˜λŠ” 핡심적인 처리 κ³Όμ •

 

μˆ˜μ •μ€‘..

Reference

λŒ“κΈ€