spring aop
๐ spring aop
์คํ๋ง aop
- AOP๋ Aspect Oriented Programming์ ์ฝ์๋ก ๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- ์ด๋ค ๋ก์ง์ ๊ธฐ์ค์ผ๋ก ํต์ฌ์ ์ธ ๊ด์ , ๋ถ๊ฐ์ ์ธ ๊ด์ ์ผ๋ก ๋๋์ด์ ๋ณด๊ณ ๊ทธ ๊ด์ ์ ๊ธฐ์ค์ผ๋ก ๊ฐ๊ฐ ๋ชจ๋ํ ํ๊ฒ ๋ค๋ ๊ฒ
- ๋ชจ๋ํ๋ ์ด๋ค ๊ณตํต๋ ๋ก์ง์ด๋ ๊ธฐ๋ฅ์ ํ๋์ ๋จ์๋ก ๋ฌถ๋ ๊ฒ์ ๋งํจ
- ๊ฐ ๊ด์ ์ ๊ธฐ์ค์ผ๋ก ๋ก์ง์ ๋ชจ๋ํ ํ๋ค๋ ๊ฒ์ ์ฝ๋๋ค์ ๋ถ๋ถ์ ์ผ๋ก ๋๋์ด์ ๋ชจ๋ํ ํ๊ฒ ๋ค๋ ์๋ฏธ
- ์์ค ์ฝ๋์์์ ๋ค๋ฅธ ๋ถ๋ถ์ ๊ณ์ ๋ฐ๋ณตํด์ ์ฐ๋ ์ฝ๋๋ค์ ๋ฐ๊ฒฌํ ์ ์๋๋ฐ ์ด๊ฒ์ ํฉ์ด์ง ๊ด์ฌ์ฌ๋ผ ๋ถ๋ฅธ๋ค
- ํฉ์ด์ง ๊ด์ฌ์ฌ๋ฅผ Aspect๋ก ๋ชจ๋ํ ํ๊ณ ํต์ฌ์ ์ธ ๋น์ฆ๋์ค ๋ก์ง์์ ๋ถ๋ฆฌํ์ฌ ์ฌ์ฌ์ฉ ํ๊ฒ ๋ค๋ ๊ฒ์ด AOP์ ์ทจ์ง์ด๋ค.
์ฉ์ด ์ ๋ฆฌ
- @Aspect : ์ด ํด๋์ค๊ฐ ๊ด์ ์์ ๋ํ๋ด๋ ์ด๋ ธํ ์ด์
- JoinPoint : Advice๊ฐ ์ ์ฉ๋ ์์น, ๋ผ์ด๋ค ์ ์๋ ์ง์ , ๋ฉ์๋ ์ง์ ์ง์ , ์์ฑ์ ํธ์ถ ์์ , ํ๋์์ ๊ฐ์ ๊บผ๋ด์ฌ๋ ๋ฅ ๋ค์ํ ์์ ์ ์ ์ฉ๊ฐ๋ฅ
- pointcut : A๋ ๋ฉ์๋์ ์ง์
์์ ์ ํธ์ถํ ๊ฒ ๊ณผ ๊ฐ์ด ๋์ฑ ๊ตฌ์ฒด์ ์ผ๋ก advice๊ฐ ์คํ๋ ์ง์ ์ ์ ํ ์ ์์
์์
```
@Aspect @Component public class MemberAspect {
@Before("execution(* read(String))")
public void beforeMethod(JoinPoint jp) {
System.out.println("[BeforeMethod] : ๋ฉ์๋ ํธ์ถ ์ ");
Signature sig = jp.getSignature();
System.out.println(" ๋ฉ์๋ ์ด๋ฆ:" + sig.getName());
Object[] obj = jp.getArgs();
System.out.println(" ์ธ์ ๊ฐ:" + obj[0]);
}
@After("execution(* read(String))")
public void afterMethod() {
System.out.println("[AfterMethod] : ๋ฉ์๋ ํธ์ถ ํ");
}
@AfterReturning(value = "execution(* read(String))", returning = "member")
public void afterReturningMethod(JoinPoint jp, StudentVO member) {
System.out.println("[afterReturningMethod] : ๋ฉ์๋ ํธ์ถ ํ");
Signature sig = jp.getSignature();
System.out.println(" ๋ฉ์๋ ์ด๋ฆ:" + sig.getName());
Object[] obj = jp.getArgs();
System.out.println(" ์ธ์ ๊ฐ:" + obj[0]);
}
@AfterThrowing(value = "execution(* read(String))", throwing = "ex")
public void afterThrowingMethod(Throwable ex) {
// ๋ฉ์๋ ํธ์ถ์ด ์์ธ๋ฅผ ๋ด๋ณด๋์ ๋ ํธ์ถ๋๋ Advice
System.out.println("[AfterThrowingMethod] : ์์ธ ๋ฐ์ ํ");
System.out.println("exception value = " + ex.toString());
} }
```
์ฝ๋์ค๋ช : ํฌ์ธํธ์ปท ํํ์ excution(*read(String))์ ์ด ์ด๋๋ฐ์ด์ค๊ฐ read(String)์๋ช ์ด ์๋ ๋ชจ๋ ๋ฉ์๋์ ์ ์ฉ๋๋ค ๋ฉ์๋๊ฐ ์คํ๋๊ธฐ ์ ์ ํธ์ถ๋๊ณ ์์์ ๋ํ๋ด๋ ๋ฉ์์ง๋ฅผ ์ธ์ํฉ๋๋ค. JoinPoint#getSignature()๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ์๋ ์๋ช ์ ๊ฒ์ํ๊ณ ๋ฉ์๋ ์ด๋ฆ์ ์ธ์ํฉ๋๋ค. ๋ํ JoinPoint#getArgs()๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ์๋ ์ธ์๋ฅผ ๊ฒ์ํ๊ณ ์ฒซ ๋ฒ์งธ ์ธ์์ ๊ฐ์ ์ธ์ํฉ๋๋ค.
@AfterReturning ์ฃผ์์ ๋์ ๋ฉ์๋๊ฐ ์ฑ๊ณต์ ์ผ๋ก ๋ฐํ๋ ํ ์ฃผ์์ด ์ง์ ๋ ๋ฉ์๋(afterReturningMethod())๊ฐ ์คํ๋จ์ ๋ํ๋ ๋๋ค. pointcut ์๊ณผ returning ์์ฑ์ ๋์ ๋ฉ์๋์ ๋ฐํ ๊ฐ์ ์บก์ฒํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. afterReturningMethod() ๋ฉ์๋ ๋ด๋ถ์ ์ด๋๋ฐ์ด์ค ๋ก์ง์ด ๊ตฌํ๋์ด ์์ต๋๋ค. ์คํ ํ ๋ฉ์๋๊ฐ ํธ์ถ๋์์์ ๋ํ๋ด๋ ๋ฉ์์ง๋ฅผ ์ธ์ํฉ๋๋ค. beforeMethod()์ ์ ์ฌํ๊ฒ ๋ฉ์๋ ์๋ช ๊ณผ ์ธ์๋ฅผ ๊ฒ์ํ๊ณ ์ธ์ํฉ๋๋ค.
@AfterThrowing ์ฃผ์์ ๋์ ๋ฉ์๋๊ฐ ์์ธ๋ฅผ throwํ๋ ๊ฒฝ์ฐ ์ฃผ์์ด ์ง์ ๋ ๋ฉ์๋(afterThrowingMethod())๊ฐ ์คํ๋จ์ ๋ํ๋ ๋๋ค. ํฌ์ธํธ์ปท ํํ์๊ณผ throwing ์์ฑ์ ๋ฐ์ํ ์์ธ๋ฅผ ์บก์ฒํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. afterThrowingMethod() ๋ฉ์๋ ๋ด๋ถ์ ์ด๋๋ฐ์ด์ค ๋ก์ง์ด ๊ตฌํ๋์ด ์์ต๋๋ค. ๋ฉ์๋์์ ์์ธ๊ฐ ๋ฐ์ํ์์ ๋ํ๋ด๋ ๋ฉ์์ง๋ฅผ ์ธ์ํฉ๋๋ค. ๋ํ ์ ๊ณต๋ Throwable ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ์์ธ ์ธ๋ถ ์ ๋ณด๋ฅผ ์ธ์ํฉ๋๋ค.
์ด aspect ํด๋์ค๋ โorg.tukorea.mywebโ ํจํค์ง์ read(String) ๋ฉ์๋์ ๋ํ ๋ฉ์๋ ํธ์ถ์ ๊ฐ๋ก์ฑ๊ณ ์ฑ๊ณต์ ์ธ ๋ฐํ ์ , ํ, ํ ๋๋ ๋์ ๋ฉ์๋์์ ์์ธ๋ฅผ throwํ ํ ์ถ๊ฐ ๋์์ ์ ๊ณตํฉ๋๋ค