AOP

ttaho·2023년 1월 27일

Spring

목록 보기
11/13

AOP가 필요한 상황

  • 모든 메소드의 호출 시간을 측정하고 싶다면?
  • 공통 관심 사항 vs 핵심 관심 사항
  • 회원 가입 시간, 회원 조회 시간을 측정하고 싶다면?

특정한 메소드의 호출 시간을 측정하는 기능을 짜면 아래와 같다.

회원가입인 join 메소드를 위와 같이 수정하여 시간을 측정할 수 있지만, 무수히 많은 메소드를 반복작업으로 구현을 해야할까?

위와 같이 시간 측정 로직인 공통 관심 사항에 핵심 관심 사항이 묶여버린다.

문제

  • 회원가입, 회원 조회에 시간을 측정하는 기능은 핵심 관심 사항이 아니다.
  • 시간을 측정하는 로직은 공통 관심 사항이다.
  • 시간을 측정하는 로직과 핵심 비즈니스의 로직이 섞여서 유지보수가 어렵다.
  • 시간을 측정하는 로직을 별도의 공통 로직으로 만들기 매우 어렵다.
  • 시간을 측정하는 로직을 변경할 때 모든 로직을 찾아가면서 변경해야 한다.

해당 문제를 해결하기위해 AOP를 사용한다.


hello.hellospirng 밑에 AOP 레포지토리를 만들고, TimeTraceAop class를 추가한다.
AOP인것을 Spring이 인식해야하므로 @Aspect와 @component 애노테이션을 달아준다.

hello.hellospirng 하위에 모두다 적용한 것

hello.hellospirng.service 하위에만 적용한 것

스프링의 AOP 동작 방식

AOP 적용 전 의존관계

AOP 적용 후 의존관계

  • 가짜memberService(프록시)를 만들어 낸 후 컨테이너에 Spring bean을 등록할때 프록시가 먼저 등록되고 AOP를 적용시킨다, 끝나면 joinPoint.proceed()할때 진짜 memberService를 등록한다.

                        AOP 적용 전 전체 그림 VS AOP 적용 후 전체 그림
                             
profile
SW Engineer

0개의 댓글