πŸ“˜ 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ν•œ ν›„ μΆ”κ°€ λ™μž‘μ„ μ œκ³΅ν•©λ‹ˆλ‹€

νƒœκ·Έ:

μΉ΄ν…Œκ³ λ¦¬:

μ—…λ°μ΄νŠΈ: