๐Ÿ“˜ spring aop

์Šคํ”„๋ง aop

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

์šฉ์–ด ์ •๋ฆฌ

  1. @Aspect : ์ด ํด๋ž˜์Šค๊ฐ€ ๊ด€์ ์ž„์„ ๋‚˜ํƒ€๋‚ด๋Š” ์–ด๋…ธํ…Œ์ด์…˜
  2. JoinPoint : Advice๊ฐ€ ์ ์šฉ๋  ์œ„์น˜, ๋ผ์–ด๋“ค ์ˆ˜ ์žˆ๋Š” ์ง€์ , ๋ฉ”์„œ๋“œ ์ง„์ž… ์ง€์ , ์ƒ์„ฑ์ž ํ˜ธ์ถœ ์‹œ์ , ํ•„๋“œ์—์„œ ๊ฐ’์„ ๊บผ๋‚ด์˜ฌ๋•Œ ๋‘ฅ ๋‹ค์–‘ํ•œ ์‹œ์ ์— ์ ์šฉ๊ฐ€๋Šฅ
  3. 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ํ•œ ํ›„ ์ถ”๊ฐ€ ๋™์ž‘์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค

ํƒœ๊ทธ:

์นดํ…Œ๊ณ ๋ฆฌ:

์—…๋ฐ์ดํŠธ: