[Spring] 7.AOP

 

1. AOP๊ฐ€ ํ•„์š”ํ•œ ์ƒํ™ฉ

ex)

- ๋ชจ๋“  ๋ฉ”์†Œ๋“œ์˜ ํ˜ธ์ถœ ์‹œ๊ฐ„ ์ธก์ •ํ•˜๊ณ ์‹ถ๋‹ค๋ฉด?

package hello.hellospring.service;
  @Transactional
  public class MemberService {
    
    /**
    * ํšŒ์›๊ฐ€์ž…
    */
    
    public Long join(Member member) {
      long start = System.currentTimeMillis();
      try {
        validateDuplicateMember(member); //์ค‘๋ณต ํšŒ์› ๊ฒ€์ฆ
        memberRepository.save(member);
        return member.getId();
      } finally {
        long finish = System.currentTimeMillis();
        long timeMs = finish - start;
        System.out.println("join " + timeMs + "ms");
      }
    }

    /**
    *์ „์ฒด ํšŒ์› ์กฐํšŒ
    */
    
    public List<Member> findMembers() {
      long start = System.currentTimeMillis();
      try {
        return memberRepository.findAll();
      } finally {
        long finish = System.currentTimeMillis();
        long timeMs = finish - start;
        System.out.println("findMembers " + timeMs + "ms");
      } 
    }
}

- ์‹œ๊ฐ„ ์ธก์ • ๋กœ์ง์€ ํ•ต์‹ฌ ๋กœ์ง์ด ์•„๋‹ˆ๋ผ ๊ณตํ†ต ๋กœ์ง

- ํ•ต์‹ฌ ๊ด€์‹ฌ ์‚ฌํ•ญ vs ๊ณตํ†ต ๊ด€์‹ฌ ์‚ฌํ•ญ

- ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๋Š” ๋กœ์ง๊ณผ ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค์˜ ๋กœ์ง์ด ์„ž์—ฌ์„œ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ต๋‹ค.

 

2. AOP ์ ์šฉ

- AOP: Aspect Oriented Programming

- ๊ณตํ†ต ๊ด€์‹ฌ ์‚ฌํ•ญ(cross-cutting concern) vs ํ•ต์‹ฌ ๊ด€์‹ฌ ์‚ฌํ•ญ(core concern) ๋ถ„๋ฆฌ

์‹œ๊ฐ„ ์ธก์ • AOP ๋“ฑ๋ก

ใ„ด hello.hellospring - aop ํด๋”์— ์ƒ์„ฑ

@Component
@Aspect
public class TimeTraceAop {

  @Around("execution(* hello.hellospring..*(..))")
  public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
    long start = System.currentTimeMillis();
    System.out.println("START: " + joinPoint.toString());
    try {
      return joinPoint.proceed();
    } finally {
      long finish = System.currentTimeMillis();
      long timeMs = finish - start;
      System.out.println("END: " + joinPoint.toString()+ " " + timeMs +
    }
}

- ํ•ด๋‹น ๊ฐ์ฒด ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋ก

- @Component ํ•ด๋„ ๋˜๊ณ  Configuration ์— ์Šคํ”„๋ง ๋นˆ ๋“ฑ๋ก๋„ ๊ฐ€๋Šฅ

- AOP๋Š” ์ธ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก Config์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ (์ •ํ˜•ํ™”ํ•ด์„œ ์“ฐ๋Š”๊ฒŒ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—)

  ์—ฌ๊ธฐ์„œ๋Š” ๊ฑ @Component

- @Around : ("execution(*hello.hellospring..*(..))")

   ํŒจํ‚ค์ง€๋ช….ํด๋”.ํด๋ž˜์Šค๋ช…(ํŒŒ๋ผ๋ฏธํ„ฐํƒ€์ž…)

   = ํŒจํ‚ค์ง€ ํ•˜์œ„ ๋‹ค ์ ์šฉ 

 

-> ํ•ต์‹ฌ๊ด€์‹ฌ์‚ฌํ•ญ ๊น”๋” ์œ ์ง€ ๊ฐ€๋Šฅ

-> ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜๋ฉด ํ•ด๋‹น ๋กœ์ง๋งŒ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ 

 

 

[์Šคํ”„๋ง์˜ AOP ๋™์ž‘ ๋ฐฉ์‹ ์„ค๋ช…]

AOP ์ ์šฉ ์ „ ์˜์กด๊ด€๊ณ„ 

AOP ์ ์šฉ ํ›„ ์˜์กด๊ด€๊ณ„

- ๊ฐ€์งœ ๋ฉค๋ฒ„์„œ๋น„์Šค(ํ”„๋ก์‹œ) ๋งŒ๋“ฆ 

- ์Šคํ”„๋ง ๋นˆ ๋“ฑ๋กํ•  ๋•Œ ๊ฐ€์งœ ์Šคํ”„๋ง๋นˆ์„ ์„ธ์šฐ๊ณ  ๊ฐ€์งœ ์Šคํ”„๋ง ๋นˆ์ด ๋๋‚˜๋ฉด proceedํ•˜๊ณ  ์ง„์งœ ๋ฉค๋ฒ„์„œ๋น„์Šค ํ˜ธ์ถœ

 

 

AOP ์ ์šฉ ์ „ ์ „์ฒด๊ทธ๋ฆผ

AOP ์ ์šฉ ํ›„ ์ „์ฒด๊ทธ๋ฆผ

* ์ปจํŠธ๋กค๋Ÿฌ์— ๋ฉค๋ฒ„ ์„œ๋น„์Šค DI ๋  ๋•Œ ํ™•์ธ๊ฐ€๋Šฅ

 

  • ๋„ค์ด๋ฒ„ ๋ธ”๋Ÿฌ๊ทธ ๊ณต์œ ํ•˜๊ธฐ
  • ๋„ค์ด๋ฒ„ ๋ฐด๋“œ์— ๊ณต์œ ํ•˜๊ธฐ
  • ํŽ˜์ด์Šค๋ถ ๊ณต์œ ํ•˜๊ธฐ
  • ์นด์นด์˜ค์Šคํ† ๋ฆฌ ๊ณต์œ ํ•˜๊ธฐ