[Spring] Spring AOP

김승현·2022년 1월 18일
0

Spring AOP

  • 관점 지향 프로그래밍(Aspect Oriented Programming)의 약자
  • 일반적으로 사용하는 클래스(Service, DAO 등)에서 중복되는 공통 코드 부분(commit, rollback, log처리 등)을 별도의 영역으로 분리해 내고, 코드가 실행되기 전이나 후의 시점에 해당 코드를 붙여 넣어 소스 코드의 중복을 줄이고, 필요할 때마다 가져다 쓸 수 있게 객체화 하는 기술

조인포인트 (Joinpoint)

  • 클라이언트가 호출하는 클래스의 모든 비즈니스 메소드 의미
  • 조인포인트를 '포인트컷 대상' 또는 '포인트컷 후보' 라고도 부름

포인트컷 (Pointcut)

  • 필터링 된 조인 포인트를 의미
  • expression 속성을 통하여 메소드 필터링
  • expression 예시
    • kr.co.sh.member.model.service..(..)
      • service 패키지에 있는 모든 클래스 및 모든 메소드(매개 변수 0개 이상)
    • kr.co.sh.member.model.service...(..)
      • service 패키지 및 하위 패키지에 있는 모든 클래스 및 모든 메소드(매개 변수 0개 이상)
    • kr.co.sh.member.model.service..()
      • service 패키지에 있는 모든 클래스 및 모든 메소드(매개 변수 없음)
    • kr.co.sh.member.model.service..(*)
    • service 패키지에 있는 모든 클래스 및 모든 메소드(매개 변수 1개)
    • int kr.co.sh.member.model.service..(Integer, ..)
      • service 패키지에 있는 모든 클래스 및 모든 메소드(매개 변수 1개 이상, 첫번째 파라미터 정수, 리턴 타입 int)

어드바이스 (Advice)

  • 횡단 관심에 해당하는 공통 기능의 코드를 의미하고, 독립된 클래스의 메소드로 작성
  • 어드바이스로 구현된 메소드가 언제 동작할지 스프링 설정 파일을 통해서 지정 가능
    • before : JoinPoint로 설정된 메소드가 실행 전 동작 수행
    • after : JoinPoint로 설정된 메소드가 성공적으로 실행된 후 동작 수행
    • after-returning : JoinPoint로 설정된 메소드가 실행 중 예외 발생하면 동작 수행
    • after-throwing : JoinPoint로 설정된 메소드가 실행 후 무조건 동작 수행
    • around : JoinPoint로 설정된 메소드 호출 자체를 가로채 비즈니스 메소드 실행 전후에 처리할 로직을 삽입할 수 있음
      • Advice 클래스 내의 해당 메소드의 파라미터로 ProceedingJoinPoint 객채 설정
      • proceed() 메소드: 비즈니스 메소드 호출 -> 비즈니스 메소드 수행 전후가 나눠짐
      • proceed() 메소드로 받는 Object 객체 형변환하여 리턴 필수

애스팩트(Aspect) 또는 어드바이저 (Advisor)

  • 포인트 컷과 어드바이스의 결합
  • 어떤 포인트 컷 메소드에 대해서, 어떤 어드바이스 메소드를 실행할지를 결정
  • 어드바이저는 애스팩트와 같지만 트랜잭션 설정 같은 몇몇의 특수한 경우에는 애스팩트가 아닌 어드바이저를 사용
    • 보통 타 프레임워크에서는 애스팩트라는 것을 사용하기도 하지만
    • 어드바이저는 스프링 AOP에서만 존재

Weaving

  • Advice를 핵심 로직 코드에 적용하는것을 weaving 이라 함 (위빙)
  • 표현하자면, 제작된 LogAdvice를 AOP 설정하여 MemberServiceImpl이 가지고 있는 메소드에 weaving(위빙)처리 해라

Target

  • 핵심 로직이 구현되어 있는 Class를 Target이라 함
  • 우리는 핵심로직이 구현되어 있는 "Target Class"에 "Advice"를 설정하는것을 AOP 라고 함

Proxy (프록시)

  • Target Class에 Advice가 적용된 최종 객체를 Proxy 라고 부름
  • 표현하자면 "Target Class"에 "Advice"가 적용되어 최종적으로 "Proxy"가 생성되는 것

JoinPoint 객체

  • JoinPoint를 어드바이스 메소드 매개변수로 선언하여 이용
  • 클라이언트가 비즈니스 메소드를 호출하면 스프링 컨테이너가 JoinPoint 객체를 생성하면서 메소드 호출과 관련된 모든 정보를 JoinPoint 객체에 저장하여 인자로 넘겨줌

JoinPoint 객체의 메소드

  • Object getTarget()

    • 클라이언트가 호출한 비즈니스 메소드를 포함하는 비즈니스 객체 리턴
  • Object[] getArgs()

    • 클라이언트가 메소드를 호출할 때 넘겨준 인자 목록을 Object 배열로 리턴
  • Signature getSignature()

    • 클라이언트가 호출한 메소드의 시그니처(리턴타입, 이름, 매개변수) 정보가 저장된 Signature 객체 리턴

Signature 객체의 메소드

  • String getName()

    • 클라이언트가 호출한 메소드 이름 리턴
  • String toLongString()

    • 클라이언트가 호출한 메소드의 리턴 타입, 이름, 매개변수를 패키지 경로까지 포함하여 리턴
  • String toShortString()

    • 클라이언트가 호출한 메소드 시그니처를 축약한 문자열로 리턴
profile
개발자로 매일 한 걸음

0개의 댓글