본문 바로가기
Back-End/Spring

7.AOP

by 두두리안 2020. 12. 29.
728x90

7.AOP

목차

  • 1.AOP가 필요한 상황
  • 2.AOP적용

1.AOP가 필요한 상황

모든 메소드의 호출시간을 측정하고 싶다면?

공통관심사항 vs 핵심관심사항

회원가입시간 , 회원조회시간을 측정하고 싶다면?

#### join

```
@Transactional
public class MemberService {

  private final MemberRepository memberRepository;

  public MemberService(MemberRepository memberRepository) {
      this.memberRepository = memberRepository;
  }
    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");
      }
     //...
  }    
}
```

일일이 다넣어줘야 된다..

유지봇가 어렵다

시간을 측정하는 로직은 공통의 로직이지만 별도로 만들기 어렵다

일일이 찾아가면서 변경을 해줘야한다..


2.AOP적용

공통관심사항과 핵심관심사항을 분리한다

#### TimeTraceAop

```
@Aspect
public class TimeTraceAop {
  @Around("execution(* hello.hellospring..*(..)) && !target(hello.hellospring.SpringConfig)")
  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 + "ms");
      }
  }
}
```

@Around("execution(* hello.hellospring..*(..))") 패키지명 하위에는 다적용

@Around 코드를 보면 SpringConfig의 timeTraceAop() 메서드도 AOP로 처리하게 된다 그래서 자기자신의 TimeTraceAop를 생성하는 코드가된다(순환참조문제)

@Around("execution(* hello.hellospring..*(..)) && !target(hello.hellospring.SpringConfig)") AOP대상에서 SpringConfig를 빼준다

#### SpringConfig

```
@Configuration
public class SpringConfig {

  @Bean
  public TimeTraceAop timeTraceAop(){
      return new TimeTraceAop();
  }

```

SpringConfig 에다가 TimeTraceAop 빈을 새로 만들어준다

![image](https://user-images.githubusercontent.com/65409092/103253669-724d8500-49c5-11eb-94a4-e6a60c825be0.png)

공통관심 사항을 분리

원하는 적용대상을 선택할수 있다

변경이 필요하면 TimeTraceAop 변경

핵심 관심사항을 깔끔하게 유지할수 있다!

728x90

'Back-End > Spring' 카테고리의 다른 글

2.스프링 핵심 원리 이해1 - 예제만들기  (0) 2020.12.31
1.객체지향설계와 스프링  (0) 2020.12.30
6.스프링 DB접근기술  (0) 2020.12.29
5.순수 JDBC 접근기술  (0) 2020.12.28
4.회원 관리 예제 - 웹 MVC개발  (0) 2020.12.28