๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’Ž/Spring

[Spring] AOP

by dar0m! 2021. 4. 18.

๊ฐœ๋…

AOP(Aspect Oriented Programming) ์˜ ์•ฝ์ž๋กœ ๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ผ๊ณ  ๋ถˆ๋ฆฐ๋‹ค. ๊ด€์  ์ง€ํ–ฅ์€ ์‰ฝ๊ฒŒ ๋งํ•ด ์–ด๋–ค ๋กœ์ง์„ ๊ธฐ์ค€์œผ๋กœ ํ•ต์‹ฌ์ ์ธ ๊ด€์ , ๋ถ€๊ฐ€์ ์ธ ๊ด€์ ์œผ๋กœ ๋‚˜๋ˆ„์–ด์„œ ๋ณด๊ณ  ๊ทธ ๊ด€์ ์„ ๊ธฐ์ค€์œผ๋กœ ๊ฐ๊ฐ ๋ชจ๋“ˆํ™”ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์—ฌ๊ธฐ์„œ ๋ชจ๋“ˆํ™”๋ž€ ์–ด๋–ค ๊ณตํ†ต๋œ ๋กœ์ง์ด๋‚˜ ๊ธฐ๋Šฅ์„ ํ•˜๋‚˜์˜ ๋‹จ์œ„๋กœ ๋ฌถ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

๋ชจ๋“ˆํ™”๋ฅผ ํ†ตํ•ด ํ•ต์‹ฌ์ ์ธ ๊ธฐ๋Šฅ์—์„œ ๋ถ€๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ๋ถ„๋ฆฌํ•œ๋‹ค. ๋ถ„๋ฆฌํ•œ ๋ถ€๊ฐ€๊ธฐ๋Šฅ์„ ์• ์ŠคํŽ™ํŠธ(Aspect)๋ผ๋Š” ๋…ํŠนํ•œ ๋ชจ๋“ˆ ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด์„œ ์„ค๊ณ„ํ•˜๊ณ  ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐฉ๋ฒ•

ํ•ต์‹ฌ๊ธฐ๋Šฅ์—์„œ ๋ถ€๊ฐ€๊ธฐ๋Šฅ์„ ๋ถ„๋ฆฌํ•ด์„œ Aspectํ˜•ํƒœ๋กœ ๋ชจ๋“ˆํ™”ํ•˜๋Š” ๊ฒƒ

  • ํ•ต์‹ฌ๊ธฐ๋Šฅ : ์—…๋ฌด ๋กœ์ง์„ ํฌํ•จํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ•ต์‹ฌ๊ธฐ๋Šฅ(Core Concerns)
  • ๋ถ€๊ฐ€๊ธฐ๋Šฅ : ํ•ต์‹ฌ๊ธฐ๋Šฅ์„ ๋„์™€์ฃผ๋Š” ๋ถ€๊ฐ€์ ์ธ ๊ธฐ๋Šฅ(๋กœ๊น…, ๋ณด์•ˆ ๋“ฑ)์„ ๋ถ€๊ฐ€๊ธฐ๋Šฅ(Cross-cutting Concerns)
  • OOP๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜์˜จ ๊ฐœ๋….
    • ๊ฐ์ฒด์ง€ํ–ฅ์˜ ๊ธฐ๋ณธ ์›์น™์„ ์ ์šฉํ•ด๋„ ํ•ต์‹ฌ๊ธฐ๋Šฅ์—์„œ ๋ถ€๊ฐ€๊ธฐ๋Šฅ์„ ๋ถ„๋ฆฌํ•ด์„œ ๋ชจ๋“ˆํ™”ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ
    • ์ด๋ฅผ AOP๊ฐ€ ํ•ด๊ฒฐ
    • AOP๋Š” ๋ถ€๊ฐ€๊ธฐ๋Šฅ์„ ์• ์ŠคํŒฉํŠธ(Aspect)๋กœ ์ •์˜ํ•˜์—ฌ, ํ•ต์‹ฌ๊ธฐ๋Šฅ์—์„œ ๋ถ€๊ฐ€๊ธฐ๋Šฅ์„ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์จ ํ•ต์‹ฌ๊ธฐ๋Šฅ์„ ์„ค๊ณ„ํ•˜๊ณ  ๊ตฌํ˜„ํ•  ๋•Œ ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ๊ฐ€์น˜๋ฅผ ์ง€ํ‚ฌ ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๊ฐœ๋…์ด๋‹ค. (์ค‘๋ณต ์ œ๊ฑฐ)
  • AOP๊ฐœ๋…์„ ์ ์šฉํ•˜๋ฉด ํ•ต์‹ฌ๊ธฐ๋Šฅ ์ฝ”๋“œ ์‚ฌ์ด์— ์นจํˆฌ๋œ ๋ถ€๊ฐ€๊ธฐ๋Šฅ์„ ๋…๋ฆฝ์ ์ธ ์• ์ŠคํŽ™ํŠธ๋กœ ๊ตฌ๋ถ„ํ•ด ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

ํ™œ์šฉ

  • ๋กœ๊น…
  • ํŠธ๋žœ์žญ์…˜
  • ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
  • ์•„ํ‚คํ…์ฒ˜ ๊ฒ€์ฆ ๋“ฑ

๋น„์ฆˆ๋‹ˆ์Šค๋‹จ์˜ ๋ฉ”์„œ๋“œ์—์„œ ์กฐ๊ธˆ ๋” ์„ธ๋ฐ€ํ•˜๊ฒŒ ์กฐ์ •ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

AOP์™€ Filter/Interceptor์˜ ์ฐจ์ด์ 

  • Interceptor๋‚˜ Filter์™€๋Š” ๋‹ฌ๋ฆฌ ๋ฉ”์†Œ๋“œ ์ „ํ›„์˜ ์ง€์ ์— ์ž์œ ๋กญ๊ฒŒ ์„ค์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
    • Interceptor์™€ Filter๋Š” ์ฃผ์†Œ๋กœ ๋Œ€์ƒ์„ ๊ตฌ๋ถ„ํ•ด์„œ ๊ฑธ๋Ÿฌ๋‚ด์•ผํ•˜๋Š” ๋ฐ˜๋ฉด,
    • AOP๋Š” ์ฃผ์†Œ, ํŒŒ๋ผ๋ฏธํ„ฐ, ์• ๋…ธํ…Œ์ด์…˜ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋Œ€์ƒ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • AOP์˜ Advice์™€ HandlerInterceptor์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ฐจ์ด๋‹ค.
    • Advice์˜ ๊ฒฝ์šฐ JoinPoint๋‚˜ ProceedingJoinPoint ๋“ฑ์„ ํ™œ์šฉํ•ด์„œ ํ˜ธ์ถœํ•œ๋‹ค.
    • ๋ฐ˜๋ฉด HandlerInterceptor๋Š” Filter์™€ ์œ ์‚ฌํ•˜๊ฒŒ HttpServletRequest, HttpServletResponse๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

 

AOP ์šฉ์–ด

์ถœ์ฒ˜(https://linkednest.net/share/jwleeDev/view/454)

  • Aspect : AOP์˜ ๊ธฐ๋ณธ ๋ชจ๋“ˆ
    • ์œ„์—์„œ ์„ค๋ช…ํ•œ ํฉ์–ด์ง„ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ชจ๋“ˆํ™” ํ•œ ๊ฒƒ. ์ฃผ๋กœ ๋ถ€๊ฐ€๊ธฐ๋Šฅ์„ ๋ชจ๋“ˆํ™”ํ•จ.
    • Advice + PointCut = Aspect
    • ๋ถ€๊ฐ€๊ธฐ๋Šฅ ์ •์˜ ์ฝ”๋“œ(Advice)์™€ ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ์ ์šฉํ•˜๋Š” ์œ„์น˜(PointCut)์„ ํ•ฉ์นœ ๊ฐœ๋…
    • ์‹ฑ๊ธ€ํ†ค ํ˜•ํƒœ์˜ ๊ฐ์ฒด๋กœ ์กด์žฌ
  • Target : ํ•ต์‹ฌ๊ธฐ๋Šฅ์„ ๋‹ด๊ณ  ์žˆ๋Š” ๋ชจ๋“ˆ๋กœ, ๋ถ€๊ฐ€๊ธฐ๋Šฅ์„ ๋ถ€์—ฌํ•  ๋Œ€์ƒ
    • Aspect๋ฅผ ์ ์šฉํ•˜๋Š” ๊ณณ (ํด๋ž˜์Šค, ๋ฉ”์„œ๋“œ .. )
  • Advice : ํƒ€๊ฒŸ(Target)์— ์ œ๊ณตํ•  ๋ถ€๊ฐ€๊ธฐ๋Šฅ์„ ๋‹ด๊ณ  ์žˆ๋Š” ๋ชจ๋“ˆ
    • ๋ถ€๊ฐ€๊ธฐ๋Šฅ์„ ์ •์˜ํ•œ ์ฝ”๋“œ. ์‹ค์งˆ์ ์ธ ๋ถ€๊ฐ€๊ธฐ๋Šฅ์„ ๋‹ด์€ ๊ตฌํ˜„์ฒด
  • Join Point : Advice๊ฐ€ ์ ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ์œ„์น˜
    • ํƒ€๊ฒŸ ๊ฐ์ฒด๊ฐ€ ๊ตฌํ˜„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋Š” ์กฐ์ธ ํฌ์ธํŠธ๊ฐ€ ๋œ๋‹ค.
    • Advice๊ฐ€ ์ ์šฉ๋  ์œ„์น˜, ๋ผ์–ด๋“ค ์ˆ˜ ์žˆ๋Š” ์ง€์ . ๋ฉ”์„œ๋“œ ์ง„์ž… ์ง€์ , ์ƒ์„ฑ์ž ํ˜ธ์ถœ ์‹œ์ , ํ•„๋“œ์—์„œ ๊ฐ’์„ ๊บผ๋‚ด์˜ฌ ๋•Œ ๋“ฑ ๋‹ค์–‘ํ•œ ์‹œ์ ์— ์ ์šฉ๊ฐ€๋Šฅ
  • PointCut : Advice๋ฅผ ์ ์šฉํ•  Target์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์„ ๋ณ„ํ•˜๋Š” ์ •๊ทœํ‘œํ˜„์‹
    • JointPoint์˜ ์ƒ์„ธํ•œ ์ŠคํŽ™์„ ์ •์˜ํ•œ ๊ฒƒ.
    • ํฌ์ธํŠธ์ปท ํ‘œํ˜„์‹์€ execution์œผ๋กœ ์‹œ์ž‘ํ•˜๊ณ , ๋ฉ”์„œ๋“œ์˜ Signature๋ฅผ ๋น„๊ตํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฃผ๋กœ ์ด์šฉํ•œ๋‹ค.
    • Advice๋ฅผ ์–ด๋””์— ์ ์šฉํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๊ฐœ๋…
    • 'A๋ž€ ๋ฉ”์„œ๋“œ์˜ ์ง„์ž… ์‹œ์ ์— ํ˜ธ์ถœํ•  ๊ฒƒ'๊ณผ ๊ฐ™์ด ๋”์šฑ ๊ตฌ์ฒด์ ์œผ๋กœ Advice๊ฐ€ ์‹คํ–‰๋  ์ง€์ ์„ ์ •ํ•  ์ˆ˜ ์žˆ์Œ
  • Advisor : Spring AOP์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ํŠน๋ณ„ํ•œ ์šฉ์–ด
    • Aspect์™€ ๋™์ผํ•œ ๊ฐœ๋…
    • Advice + PointCut = Advisor
  • Weaving : ํฌ์ธํŠธ์ปท(PointCut)์— ์˜ํ•ด์„œ ๊ฒฐ์ •๋œ ํƒ€๊ฒŸ(Target)์˜ ์กฐ์ธ ํฌ์ธํŠธ(Join Point)์— ๋ถ€๊ฐ€๊ธฐ๋Šฅ(Advice)์„ ์‚ฝ์ž…ํ•˜๋Š” ๊ณผ์ • 
    • ์œ„๋น™์€ AOP๊ฐ€ ํ•ต์‹ฌ๊ธฐ๋Šฅ(ํƒ€๊ฒŸ)์˜ ์ฝ”๋“œ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์œผ๋ฉด์„œ ํ•„์š”ํ•œ ๋ถ€๊ฐ€๊ธฐ๋Šฅ(Advice)์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ํ•ต์‹ฌ์ ์ธ ์ฒ˜๋ฆฌ ๊ณผ์ •

 

Spring AOP ํŠน์ง•

  • Spring์€ ํ”„๋ก์‹œ(Proxy) ๊ธฐ๋ฐ˜ AOP๋ฅผ ์ง€์›ํ•œ๋‹ค.
    • Spring์€ ํƒ€๊ฒŸ(target)๊ฐ์ฒด์— ๋Œ€ํ•œ ํ”„๋ก์‹œ๋ฅผ ๋งŒ๋“ค์–ด ์ œ๊ณตํ•œ๋‹ค.
    • ํƒ€๊ฒŸ์„ ๊ฐ์‹ธ๋Š” ํ”„๋ก์‹œ๋Š” ์‹คํ–‰์‹œ๊ฐ„(Runtime)์— ์ƒ์„ฑ๋œ๋‹ค.
    • ํ”„๋ก์‹œ๋Š” ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ํƒ€๊ฒŸ ๊ฐ์ฒด์— ์ ์šฉํ•˜๋ฉด์„œ ์ƒ์„ฑ๋˜๋Š” ๊ฐ์ฒด์ด๋‹ค.
  • ํ”„๋ก์‹œ๊ฐ€ ํ˜ธ์ถœ์„ ๊ฐ€๋กœ์ฑˆ๋‹ค(Intercept)
    • ํ”„๋ก์‹œ๋Š” ํƒ€๊ฒŸ ๊ฐ์ฒด์— ๋Œ€ํ•œ ํ˜ธ์ถœ์„ ๊ฐ€๋กœ์ฑˆ ๋‹ค์Œ ์–ด๋“œ๋ฐ”์ด์Šค์˜ ๋ถ€๊ฐ€๊ธฐ๋Šฅ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋‚œ ํ›„์— ํƒ€๊ฒŸ์˜ ํ•ต์‹ฌ๊ธฐ๋Šฅ ๋กœ์ง์„ ํ˜ธ์ถœํ•œ๋‹ค. (์ „์ฒ˜๋ฆฌ ์–ด๋“œ๋ฐ”์ด์Šค)
    • ๋˜๋Š” ํƒ€๊ฒŸ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ๋กœ์ง ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ํ›„์— ๋ถ€๊ฐ€๊ธฐ๋Šฅ(์–ด๋“œ๋ฐ”์ด์Šค)์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค. (ํ›„์ฒ˜๋ฆฌ ์–ด๋“œ๋ฐ”์ด์Šค)
  • Spring AOP๋Š” ๋ฉ”์„œ๋“œ ์กฐ์ธ ํฌ์ธํŠธ๋งŒ ์ง€์›ํ•œ๋‹ค.
    • Spring์€ ๋™์  ํ”„๋ก์‹œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ AOP๋ฅผ ๊ตฌํ˜„ํ•˜๋ฏ€๋กœ ๋ฉ”์„œ๋“œ ์กฐ์ธ ํฌ์ธํŠธ๋งŒ ์ง€์›ํ•œ๋‹ค. ์ฆ‰, ํ•ต์‹ฌ๊ธฐ๋Šฅ(ํƒ€๊ฒŸ)์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๋Ÿฐํƒ€์ž„ ์‹œ์ ์—๋งŒ ๋ถ€๊ฐ€๊ธฐ๋Šฅ(์–ด๋“œ๋ฐ”์ด์Šค)์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
      • ๋Ÿฐํƒ€์ž„์‹œ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฏ€๋กœ final ํด๋ž˜์Šค์—๋Š” ์žฌ์ •์˜ํ•  ์ˆ˜ ์—†๋Š” ํ•œ๊ณ„๊ฐ€ ์กด์žฌ
      • ์ด ํ•œ๊ณ„๋Š” static๊ณผ final ๋ฉ”์„œ๋“œ์—๋„ ๋™์ผํ•˜๋‹ค.
      • ๋”ฐ๋ผ์„œ Spring AOP๋Š” ๋ฉ”์„œ๋“œ ์‹คํ–‰์—๋งŒ JoinPoint๋ฅผ ์ง€์›ํ•œ๋‹ค.
    • ๋ฐ˜๋ฉด AspectJ ๊ฐ™์€ ๊ณ ๊ธ‰ AOP ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ์ฒด์˜ ์ƒ์„ฑ, ํ•„๋“œ๊ฐ’์˜ ์กฐํšŒ์™€ ์กฐ์ž‘, static ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ๋ฐ ์ดˆ๊ธฐํ™” ๋“ฑ์˜ ๋‹ค์–‘ํ•œ ์ž‘์—…์— ๋ถ€๊ฐ€๊ธฐ๋Šฅ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
      • AspectJ๋Š” ๋Ÿฐํƒ€์ž„ ์ด์ „์— ์‹ค์ œ ์ฝ”๋“œ์— Cross-Cutting Concerns์„ Weavingํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋งŽ์€ JoinPoint๋ฅผ ์ง€์›ํ•œ๋‹ค.

์ถœ์ฒ˜: https://kils-log-of-develop.tistory.com/638

AOP์˜ PointCut

  • @Before: ๋Œ€์ƒ ๋ฉ”์„œ๋“œ์˜ ์ˆ˜ํ–‰ ์ „
  • @After: ๋Œ€์ƒ ๋ฉ”์„œ๋“œ์˜ ์ˆ˜ํ–‰ ํ›„
  • @After-returning: ๋Œ€์ƒ ๋ฉ”์„œ๋“œ์˜ ์ •์ƒ์ ์ธ ์ˆ˜ํ–‰ ํ›„
  • @After-throwing: ์˜ˆ์™ธ๋ฐœ์ƒ ํ›„
  • @Around: ๋Œ€์ƒ ๋ฉ”์„œ๋“œ์˜ ์ˆ˜ํ–‰ ์ „/ํ›„

ํ‘œํ˜„์‹ ๋ฌธ๋ฒ•

ํฌ์ธํŠธ์ปท ํ‘œํ˜„์‹์€ ํฌ์ธํŠธ์ปท ์ง€์‹œ์ž๋ฅผ ์ด์šฉํ•˜์—ฌ ์ž‘์„ฑํ•œ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ง€์‹œ์ž๋Š” excution()์ด๋‹ค. ๋ฌธ๋ฒ• ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

excution( [์ ‘๊ทผ์ œํ•œ์ž ํŒจํ„ด] ํƒ€์ž…ํŒจํ„ด [ํƒ€์ž…ํŒจํ„ด.] ์ด๋ฆ„ํŒจํ„ด (ํƒ€์ž…ํŒจํ„ด | "..", ...) [throws ์˜ˆ์™ธํŒจํ„ด] )
  • [์ ‘๊ทผ์ œํ•œ์ž ํŒจํ„ด] : public, private๊ณผ ๊ฐ™์€ ์ ‘๊ทผ์ œํ•œ์ž, ์ƒ๋žต ๊ฐ€๋Šฅ
  • ํƒ€์ž…ํŒจํ„ด : ๋ฆฌํ„ด๊ฐ’์˜ ํƒ€์ž… ํŒจํ„ด
  • [ํƒ€์ž…ํŒจํ„ด.] : ํŒจํ‚ค์ง€์™€ ํด๋ž˜์Šค ์ด๋ฆ„์— ๋Œ€ํ•œ ํŒจํ„ด, ์ƒ๋žต๊ฐ€๋Šฅ ์‚ฌ์šฉํ•  ๋•Œ '.'์„ ์‚ฌ์šฉํ•ด ์—ฐ๊ฒฐํ•จ
  • ์ด๋ฆ„ํŒจํ„ด : ๋ฉ”์„œ๋“œ ์ด๋ฆ„ ํƒ€์ž…ํŒจํ„ด
  • (ํƒ€์ž…ํŒจํ„ด | "..", ...) : ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ํƒ€์ž… ํŒจํ„ด์„ ์ˆœ์„œ๋Œ€๋กœ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค. ์™€์ผ๋“œ์นด๋“œ๋ฅผ ์ด์šฉํ•ด ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐœ์ˆ˜์— ์ƒ๊ด€์—†๋Š” ํŒจํ„ด์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
  • [throws ์˜ˆ์™ธํŒจํ„ด] : ์˜ˆ์™ธ์ด๋ฆ„ํŒจํ„ด

์˜ˆ์‹œ 28:05

 

JoinPoint ์ธํ„ฐํŽ˜์ด์Šค

JoinPoint๋Š” Spring AOP ํ˜น์€ AspectJ์—์„œ AOP๊ฐ€ ์ ์šฉ๋˜๋Š” ์ง€์ ์„ ๋œปํ•œ๋‹ค.
ํ•ด๋‹น ์ง€์ ์„ AspectJ์—์„œ JoinPoint๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • getArgs() : ๋ฉ”์„œ๋“œ ์•„๊ทœ๋จผํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • getThis() : ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • getTarget() : ๋Œ€์ƒ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • getSignature() : ์–ด๋“œ๋ฐ”์ด์ฆˆ๋˜๋Š” ๋ฉ”์„œ๋“œ์˜ ์„ค๋ช…(description)์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • toString() : ์–ด๋“œ๋ฐ”์ด์ฆˆ๋˜๋Š” ๋ฉ”์„œ๋“œ์˜ ์„ค๋ช…์„ ์ถœ๋ ฅํ•œ๋‹ค.

๋“ฑ ์œ ์šฉํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

๋ชจ๋“  ์–ด๋“œ๋ฐ”์ด์Šค๋Š” org.aspectj.lang.JoinPoint ํƒ€์ž…์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์–ด๋“œ๋ฐ”์ด์Šค ๋ฉ”์„œ๋“œ ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค.

Around ์–ด๋“œ๋ฐ”์ด์Šค๋Š” JoinPoint์˜ ํ•˜์œ„ ํด๋ž˜์Šค์ธ ProceedingJoinPoint ํƒ€์ž…์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ•„์ˆ˜์ ์œผ๋กœ ์„ ์–ธํ•ด์•ผ ํ•œ๋‹ค.

  • ProceedingJoinPoint ๋Š” JoinPoint ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›์€ ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.
    • proceed() ๋ฉ”์„œ๋“œ ์ œ๊ณต.
      • ํƒ€๊ฒŸ ๊ฐ์ฒด์˜ ์•ž ๋’ค๋กœ ์–ด๋“œ๋ฐ”์ด์Šค๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํƒ€๊ฒŸ ๊ฐ์ฒด๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
      • ProceedingJoinPoint ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์–ด๋“œ๋ฐ”์ด์Šค ํด๋ž˜์Šค ๋‚ด์—์„œ proceed() ๋ฉ”์„œ๋“œ๋ฅผ ๋ฐ˜๋“œ์‹œ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค.
      • ์ธ์ž๊ฐ€ ์žˆ๋Š” ํ˜•ํƒœ, ์—†๋Š” ํ˜•ํƒœ ๋‘๊ฐ€์ง€๋กœ ์ œ๊ณต๋œ๋‹ค.

 

์ฐธ๊ณ 

๋Œ“๊ธ€