[Spring] Spring AOP

박세윤·2023년 4월 12일
0

Spring

목록 보기
2/11
post-thumbnail

📌 Spring AOP


✅ AOP Aspect Oriented Programming

  • OOP에서 모듈화의 핵심 단위는 클래스인 반면, AOP에서 모듈화의 단위는 Aspect

  • Aspect는 여러 타입과 객체에 거쳐서 사용되는 기능 (Cross Cutting, 트랜잭션 관리 등)의 모듈화

  • Spring framework의 필수 요소는 아니지만, AOP 프레임워크는 Spring IoC를 보완한다.



✅ AOP 용어

  • Aspect : 여러 클래스에 공통적으로 구현되는 관심사(Concern)의 모듈화

  • Join Point : 메서드 실행이나 예외처리와 같은 프로그램 실행 중의 특정 지점, Spring에서는 메서드 실행을 의미한다.

  • Advice : 특정 조인 포인트(Join Point)에서 Aspect에 의해서 취해진 행동, Around, Before, After 등의 Advice 타입이 존재

  • Pointcut : Join Point에 Aspect를 적용하기 위한 조건 서술.

    • Join Point에 Aspect를 적용하기 위한 조건 서술
    • Aspect는 지정한 pointcut에 일치하는 모든 join point에서 실행된다.
  • Target 객체 : 하나 이상의 advice가 적용될 객체

    • Spring AOP는 Runtime Proxy를 사용하여 구현되므로, 객체는 항상 Proxy 객체가 된다.
    • Proxy : 대행자, 대신
  • AOP Proxy : AOP를 구현하기 위해 AOP 프레임워크에 의해 생성된 객체, Spring Framework에서 AOP 프록시는 JDK dynamic proxy 또는 CGLIB proxy이다.

  • Weaving : Aspect를 다른 객체와 연결하여 Advice 객체를 생성

    • 런타임 또는 로딩 시 수행할 수 있지만 Spring AOP는 런타임에 위빙을 수행



✅ Spring AOP Proxy

  • 실제 기능이 구현된 Target 객체를 호출하면, target이 호출되는 것이 아니라, advice가 적용된 Proxy 객체가 호출된다.

  • Spring AOP는 기본값으로 표준 JDK dynamic proxy를 사용

  • 인터페이스를 구현한 클래스가 아닌 경우, CGLIB 프록시 사용



✅ Spring AOP

  • @AspectJ : 일반 Java 클래스를 Aspect로 선언하는 스타일

  • Spring AOP에서는 pointcut 구문 분석, 매핑을 위해서 AspectJ 라이브러리 사용

  • AOP runtime은 순수 Spring AOP이며, AspectJ에 대한 종속성은 없다.

우리는 mvnrepository

aspectjweaver 1.9.8
aspectjruntime 1.9.8
버전 사용



✅ Spring AOP 시작하기 - xml

  • Aspect : 핵심 관심사항 (Core concern)

  • Pointcut 선언
    • 포인트 컷 : 어떤 조인포인트를 사용할지 결정
    • Spring AOP : 메서드 실행만 지원
      - 조인포인트에 대한 표현식, 포인트 컷의 이름 두 내용을 포함한다.


  • @AspectJ 활성화 - aop:aspectj-autoproxy


  • Bean 등록 및 @Aspect


  • Pointcut 설정


  • advice type 지정



✅ Advice Type

  • before : target 메서드 호출 이전

  • after : target 메서드 호출 이후, java exception 문장의 finally와 같이 동작

  • after returning : target 메서드 정상 동작 후

  • after throwing : target 메서드 에러 발생 후

  • around : target 메서드의 실행시기, 방법, 실행여부를 결정



✅ Advice Type - after returning, after throwing

  • after returning은 실행 결과를 인자로 받음

  • after throwing은 에러를 인자로 받음


  • annotation 설정



✅ Advice Type - around



✅ Pointcut Expression 패턴 예시



profile
개발 공부!

0개의 댓글