AOP (Aspect-Oriented Programming)
์ค๋ช
์ฌ๋ฌ ๋ก์ง๋จ์ ์ ์ฉ๋์ด์ผ ํ ํน์ ์ค๋ณต ๋ก์ง์ ์ฌ๋ฌ ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ์ ์ฉํ๋ ๊ฒ
ํฉ์ด์ง ์ฝ๋๋ฅผ ํ๊ณณ์ผ๋ก ๋ชจ์ผ์!
ํก๋จ ๊ด์ฌ์ ๋ฐ๋ผ ํ๋ก๊ทธ๋๋ฐ ํ๋๊ฒ
โป ํก๋จ
๋์ ๋ฐฉํฅ์ผ๋ก ๊ฐ๋ก์ง๋ฌ ๊ฐ๋๊ฒ
โป ํก๋จ ๊ด์ฌ์ฌ (Cross cutting concern)
๋ค์์ ๋ชจ๋์ ๊ณตํต์ ์ผ๋ก ๋ํ๋๋ ๋ถ๋ถ์ด ์กด์ฌ
๋ชจ๋๋ณ๋ก ๋ฐ๋ณต๋์ด ์ค๋ณตํด์ ๋ํ๋๋ ๋ถ๋ถ๋ฐ๋ณต๊ณผ ์ค๋ณต์ ๋ถ๋ฆฌํ์ฌ ํ๊ณณ์์ ํํํด์ผ ํ๋ค๋ผ๋๊ฒ์ ํญ์ ์ธ์งํด์ผ ํจ.
ํน์ง
Aspect ์ผ๋ก ํํ
๋ก์ง(Code) ์ฃผ์
๋ก๊น
, ๋ณด์, ํธ๋์ญ์
๊ธฐ๋ฅ์ด ๋ฐ๋ณต์ ์ผ๋ก ๋ํ๋จ
AOP๋ ํ๋ก์ ๊ธฐ๋ฐ, ์ธํฐํ์ด์ค ๊ธฐ๋ฐ, ๋ฐํ์ ๊ธฐ๋ฐ ์ด๋ค.
๋ฉ์๋์ ์ฃผ์
ํ ์ ์๋ ์์ญ
@Before: ๋์ ๋ฉ์๋ ์์ ์
@After: ๋์ ๋ฉ์๋ ์์ ํ
@AfterReturning: ๋์ ๋ฉ์๋ ์ ์ ์ข
๋ฃ ํ
@AfterThrowing: ๋์ ๋ฉ์๋ ์์ธ ๋ฐ์ → ์ข
๋ฃ ํ
AOP ์ฉ์ด
Aspect |
์ฌ๋ฌ๊ฐ์ Advice, ์ฌ๋ฌ๊ฐ์ Pointcut์ ๊ฒฐํฉ์ฒด๋ฅผ ์๋ฏธํ๋ ์ฉ์ด |
Advisor |
ํ๊ฐ์ Advice, ํ๊ฐ์ Pointcut |
Advice |
pointcut์ ์ ์ฉํ ๋ก์ง, ์ฆ ๋ฉ์๋๋ฅผ ์๋ฏธ
@Before("execution( * runSomething())") public void before(JoinPoint joinPoint) { ... } |
JoinPoint |
์ฐ๊ฒฐ์ . ์ฐ๊ฒฐ ๊ฐ๋ฅํ ์ง์ . Aspect ์ ์ฉ ๊ฐ๋ฅ ์ง์ . ์คํ๋ง ํ๋ ์์ํฌ๊ฐ ๊ด๋ฆฌํ๋ ๋น์ ๋ชจ๋ ๋ฉ์๋
public void before(JoinPoint joinPoint) { ... } |
Pointcut |
์๋ฅด๋ ์ง์ , Aspect ์ ์ฉ ์์น ์ง์ ์. ํก๋จ ๊ด์ฌ์ฌ๋ฅผ ์ ์ฉํ ํ๊น ๋ฉ์๋๋ฅผ ์ ํํ๋ ์ง์์.
@Before("execution( * runSomething())") → runSomething() ์คํ ์ AOP์ ์คํํ๋ผ๋ ๋ป |
Pointcut ์ง์ ์ ๊ด๋ จ
execution
์ผ์นํ๋ ๋ฉ์๋ ์คํ ์กฐ์ธ ํฌ์ธํธ์ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๊ฒ์ Spring AOP๋ก ์์
ํ ๋ ์ฌ์ฉํ๋ ์ฃผ์ ํฌ์ธํธ ์ปท ์ง์ ์์
๋๋ค.
within
ํน์ ์ ํ ๋ด ๊ฒฐํฉ ์ ์ ๋ํ ๋งค์นญ์ ์ ํํฉ๋๋ค (Spring AOP ์ฌ์ฉ์ ๋งค์นญ ์ ํ ๋ด์์ ์ ์ธ ๋ ๋ฉ์๋ ์คํ).
this
๋น ์ฐธ์กฐ (Spring AOP ํ๋ก์)๊ฐ ์ฃผ์ด์ง ์ ํ์ ์ธ์คํด์ค ์ธ ์กฐ์ธ ํฌ์ธํธ (Spring AOP ์ฌ์ฉ์ ๋ฉ์๋ ์คํ)์ ๋ํ ๋งค์นญ์ ์ ํํฉ๋๋ค.
target
๋์ ๊ฐ์ฒด (ํ๋ก์๋๋ ์ ํ๋ฆฌ์ผ์ด์
๊ฐ์ฒด)๊ฐ ์ฃผ์ด์ง ์ ํ์ ์ธ์คํด์ค ์ธ ์กฐ์ธ ํฌ์ธํธ (Spring AOP ์ฌ์ฉ์ ๋ฉ์๋ ์คํ)์ ๋ํ ๋งค์นญ์ ์ ํํฉ๋๋ค.
args
์ธ์๊ฐ ์ฃผ์ด์ง ์ ํ์ ์ธ์คํด์ค ์ธ ์กฐ์ธ ํฌ์ธํธ (Spring AOP ์ฌ์ฉ์ ๋ฉ์๋ ์คํ)์ ๋ํ ๋งค์นญ์ ์ ํํฉ๋๋ค.
@target
์คํ ๊ฐ์ฒด์ ํด๋์ค๊ฐ ์ฃผ์ด์ง ํ์
์ ์ด๋
ธํ
์ด์
์ ๊ฐ์ง๊ณ ์๋ join point (Spring AOP ์ฌ์ฉ์ ๋ฉ์๋ ์คํ)๋ก ๋งค์นญ์ ์ ํํฉ๋๋ค.
@args
์ ๋ฌ ๋ ์ค์ ์ธ์์ ๋ฐํ์ ์ ํ์ด ์ฃผ์ด์ง ์ ํ์ ์ด๋
ธํ
์ด์
์ ๊ฐ๋ ๊ฒฐํฉ ์ง์ (Spring AOP ์ฌ์ฉ์ ๋ฉ์๋ ์คํ)์ ๋ํ ์ผ์น๋ฅผ ์ ํํฉ๋๋ค.
@within
์ฃผ์ด์ง ์ด๋
ธํ
์ด์
(Spring AOP๋ฅผ ์ฌ์ฉํ ๋ ์ฃผ์ด์ง ์ด๋
ธํ
์ด์
์ด์๋ ํ์
์์ ์ ์ธ ๋ ๋ฉ์๋์ ์คํ)์ด์๋ ํ์
๋ด์์ ์กฐ์ธ ํฌ์ธํธ์ ๋ํ ๋งค์นญ์ ์ ํํฉ๋๋ค.
@annotation
Join point์ ์ฃผ์ (Spring AOP์์ ์คํ๋๋ ๋ฉ์๋)๊ฐ ์ฃผ์ด์ง ์ด๋
ธํ
์ด์
์ ๊ฐ์ง๊ณ ์๋ join point๋ก ๋งค์นญ์ ์ ํํฉ๋๋ค.
Pointcut ํํ์ ์์
๋ชจ๋ ๊ณต์ฉ ๋ฉ์๋ ์คํ
execution(public * * (..))
๋ค์์ผ๋ก ์์ํ๋ ์ด๋ฆ์ ๊ฐ์ง ๋ชจ๋ ๋ฉ์๋์ ์คํ
setexecution(* set * (..))
AccountService์ธํฐํ์ด์ค์ ์ํด ์ ์ ๋ ๋ชจ๋ ๋ฉ์๋์ ์คํ
execution(* com.xyz.service.AccountService. * (..))
serviceํจํค์ง์ ์ ์ ๋ ๋ชจ๋ ๋ฉ์๋ ์คํ
execution(* com.xyz.service. *. * (..))
์๋น์ค ํจํค์ง ๋๋ ํ์ ํจํค์ง ์ค ํ๋์ ์ ์ ๋ ๋ชจ๋ ๋ฉ์๋ ์คํ
execution(* com.xyz.service .. *. * (..))
์๋น์ค ํจํค์ง ๋ด์ ๋ชจ๋ ์กฐ์ธ ํฌ์ธํธ (Spring AOP์์๋ง ๋ฉ์๋ ์คํ)
within(com.xyz.service. *)
์๋น์ค ํจํค์ง ๋๋ ํ์ ํจํค์ง ์ค ํ๋ ๋ด์ ๋ชจ๋ ์กฐ์ธ ์ง์ (Spring AOP์์๋ง ๋ฉ์๋ ์คํ)
within(com.xyz.service .. *)
ํ๋ก์๊ฐ AccountService์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๋ชจ๋ ์กฐ์ธ ํฌ์ธํธ (Spring AOP์์๋ง ๋ฉ์๋ ์คํ)
this(com.xyz.service.AccountService)
์ฐธ๊ณ
https://wikibook.co.kr/java-oop-for-spring/ (์ฑ
: ์คํ๋ง ์
๋ฌธ์ ์ํ ์๋ฐ ๊ฐ์ฒด์งํฅ์ ์๋ฆฌ์ ์ดํด)
https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#aop