AOP

이민성·2022년 8월 28일
0

spring 입문

목록 보기
5/5

AOP가 필요한 상황

AOP: Aspect Oriented Programming(관점 지향 프로그래밍)

  • 각 메소드의 동작 시간을 측정하고 싶다면?

    회원가입, 회원조회 기능에 시간측정 로직 추가
    MemberService

public Long join(Member member) {
        // 같은 이름이 있는 중복 회원X
        long start = System.currentTimeMillis(); //시작시간 측정
        try{
            validateDuplicateMember(member);
            memberRepository.save(member);
            return member.getId();
        }finally {              //로직이 끝날 때 시간 측정-> finally
            long finish = System.currentTimeMillis();   //끝난 시간
            long timeMs = finish - start;
            //걸린 시간 = 끝난 시간 - 시작 시간
            System.out.println("join = " + timeMs +  "ms");
        }
    }

->실행

localhost8080 -> 회원 목록 실행

문제

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

AOP 적용


TimeTraceAop에 시간 측정 로직을 한 곳에 모아두고 원하는 곳에 적용시킴

  1. aop패키지 생성 후 TimeTraceAop클래스 생성
    Aop는 사용하려면 @Aspect 추가
    TimeTraceAop
  1. 컴포넌트 스캔으로 스프링 빈으로 등록
    *@Component 컴포넌트 스캔도 있지만 정형화된 코드가 아니기 때문에
    스프링 빈에 등록하는 것을 선호
  1. @Around("execution( 패키지,클래스명..(..))")
    공통범위에 적용시키기 위해 hellospring패키지 전체에 전부 적용

    ex)
    @Around("execution( hello.hellospring..(..))")
    @Around("execution( hello.hellospring.service..(..))")

  1. localhost8080 실행

해결

  • 회원가입, 회원 조회 등 핵심 관심 사항과 시간을 측정하는 공통 관심 사항을 분리한다.
  • 시간을 측정하는 로직을 별도의 공통 로직으로 만들었다.
  • 핵심 관심 사항을 깔끔하게 유지할 수 있다.
  • 변경이 필요하면 이 로직만 변경하면 된다.
  • 원하는 적용 대상을 선택할 수 있다.

AOP적용 후 의존관계


AOP적용하고 어디에 적용할지 지정을 하게 되면 스프링 빈에 등록할 때 가짜 멤버서비스를 먼저 호출시킴. 그 후 joinPoint.proceed()로 실제 멤버 서비스를 호출 --> Proxy

멤버 컨트롤러의 멤버 서비스가 실제 porxy가 주입되는지 확인

System.out.println("memberService" + memberService.getClass());

AOP적용 후 전체 그림

  • DI의 장점 - 가짜를 주입을 해줘서 AOP를 가능하게 함

0개의 댓글