IT 정보/Spring

[Spring] AOP 기본 개념

개발하는 동그리 2022. 6. 21. 13:57

기본 개념

  • 핵심 기능 : 업무 로직 포함하는 기능 ( 업무 관련 코드 )
  • 부가 기능 : 핵심 기능을 돕는 부가 기능 ( 트랜잭션, 보안, 로깅코드 등 =  횡단 관심사 ) (공통 기능)
  • Aspect : 부가 기능을 정의한 코드 (advice) + 적용할 위치를 결정하는 (PointCut)을 합친 기능이다. 

주요 개념

  • Spring MVC 구조 
    • @Controller
    • @Service
    • @Repository
  • Spring MVC 구조와 같이 관심사 별로 계층을 나눠서 객체를 관리한다 이를 관심사의 분리, 모듈화라고 부른다.

AOP 란!?

(Aspect-Oriented Programming)은 기존과 다른 프로그램 구조 사고 방식으로 객체 지향 프로그래밍의 부족한 부분을 보완한다. 핵심기능과 부가 기능을 분리함 으로써 변경 지점이 하나가 될 수 있도록 모듈화 시키는 것 (불필요한 반복 제거)

  • OOP의 모듈화의 핵심 단위는 클래스
  • AOP의 모듈화의 핵심 단위는 관점

따라서 AOP Aspect는 여러 유형과 객체 간에 발생하는 문제 (ex - 트랜잭션)의 모듈화를 가능하게 한다. 

AOP 용어 설명

Aspect 

  • 여러 객체에 공통으로 적용 되는 기능 ( 공통 기능)
  • advice + pointcut 을 모듈화하여 어플리케이션에 포함되는 횡단 기능
  • 여러개의 advice와 pointcut이 함께 존재한다.

 

join point

  • 애플리케이션에 새 동작을 추가하기위해 조인 포인트에 aspect code를 추가할 수 있다. 
  • 스프링 AOP는 프록시 방식을 사용하므로 조인포인트는 항상 메서드 실행 지점으로 제한된다. 
  • join point란 AOP를 적용할 수 있는 지점을 말한다. 

 

Advice

  • 특정 조인 포인트에서 수행되는 코드를 의미
  • Aspect를 언제 핵심 코드에 적용할지 정의
  • 시스템 전체 Aspect에 API 호출을 제공
  • 메서드 호출 전 로그(상세 정보, 모든 메서드의 로그)를 남기기 위해 메서드 시작전 포인트 S를 선택
  • (부가 기능)

 

pointcut

  • 조인 포인트 중에서 어드바이스가 적용될 위치 결정
  • Aspect 표현식을 이용
  • 프록시를 사용하는 스프링 AOP는 메서드 실행 지점만 포인트컷으로 선별 가능

 

Weaving 

  • 포인트 컷으로 결정한 타겟(조인 포인트)에 advice를 핵심 코드에 적용
  • 핵심 기능 코드와 무관하게 부가 기능 추가할 수 있음
  • AOP 적용을 위해 Aspect 객체에 연결한 상태
    • 컴파일 타임
    • 로드 타임
    • 런타임, 스프링 AOP 런타임, 프록시 방식

 

AOP proxy

  • AOP 기능을 구현하기 위해 만든 프록시 객체
  • 스프링에서의 AOP 프록시는 CGLIB 프록시 or JDK 동적 프록시다.

 

Target 

  • 핵심 기능을 담고 있는 모듈이고, 타겟은 부가기능을 부여할 대상이 된다.
  • advice를 받는 객체이며, 포인트 컷으로 결정된다.

 

Advisor 

  • 하나의 어드바이스와 포인트 컷으로 구성된다.

Advice

  • 어드바이스는 순서를 보장하지 않는다. 
  • Aspect를 별도의 클래스로 분리해야 한다. 

Advice 종류

  • Before
    • 조인 포인트 실행 이전에 실행된다.
    • 타겟 메서드가 실행되기 전에 처리할 부가기능을 호출 하기 전 공통 기능을 실행한다.
    • Before Advice 구현한 메서드는 일반적으로 리턴타입이 void이다.
    • 예외 발생시 메서드가 호출되지 않는다.

 

  • After returning
    • 조인 포인트가 정상 완료 후 실행된다.
    • 메서드가 예외 없이 실행된 이후에 공통 기능을 실행한다.

 

  • After throwing
    • 메서드가 예외를 던지는 경우 실행
    • 메서드가 실행하는 도중에 예외가 발생한 경우 공통기능 실행 

 

  • After (finally)
    • 조인 포인트의 동작과 관계없이 실행
      • 예외 동작의 finally
    • 메서드 실행 후 공통기능 실행
    • 리소스를 해제하는데 사용

 

  • Around
    • 메서드 호출 전후에 수행하며 가장 강력한 어드바이스
      • 조인 포인트 실행 여부 선택 - joinPoint.proceed()
      • 전달 값 변환 - joinPoint.proceed(args[])
      • 반환 값 변환
      • 예외 변환
      • Try ~ catch ~ finally 가 들어가는 구문 처리 가능
    • 메서드 실행 전, 실행 후, 예외 발생 시점에 공통 기능을 실행한다.
    • proceed()를 통해 대상을 실행하고, 여러번 실행할 수 있다.

Pointcut 표현식

  • 포인트 컷은 관심 조인 포인트를 결정해서 advice가 실행되는 시기를 결정할 수 있다.
  • 포인트 컷 지시자 : executuon 
    • 메서드 실행 조인트 포인트를 매칭한다. 
    • 스프링 AOP에서 가장 많이 사용하고, 기능이 복잡하다.

JoinPoint

  • AOP는 메서드 실행 위치뿐만 아니라 다양한 위치에도 적용이 가능하다. 
    • 생성자, 필드 값 접근, static 메서드 접근, 메서드 실행
  • AOP를 수행하는 메서드는 JoinPoint 인스턴스를 인자로 받게된다. 
  • JoinPoint 인스턴스에서 조인 포인트 지점의 정보를 얻어내야 한다.

 

인터페이스 주요기능

  • JoinPoint.getArgs() : JoinPoint에 전달된 인자를 배열로 반환합니다.
  • JoinPoint.getThis() : AOP 프록시 객체를 반환합니다.
  • JoinPoint.getTarget() : AOP가 적용된 대상 객체를 반환합니다.
    • 클라이언트가 호출한 비즈니스 메소드를 포함하는 비즈니스 객체를 반환합니다.
  • JoinPoint.getSignature() : 조언되는 메서드에 대한 설명을 반환합니다.
    • 클라이언트가 호출한 메소드의 시그니처(리턴타입, 이름, 매개변수) 정보가 저장된 Signature 객체를 반환합니다
    • Signature
      • 객체가 선언하는 모든 연산은 연산의 이름, 매개변수로 받아들이는 객체들을 시그니처라고 합니다.
    • Signature가 제공하는 메서드
      • String getName() : 클라이언트가 호출한 메소드의 이름을 반환합니다.
      • String toLongString() : 클라리언트가 호출한 메소드의 리턴타입, 이름, 매개변수를 패키지 경로까지 포함해서 반환합니다.
      • String toShortString() : 클라이언트가 호출한 메소드 시그니처를 축약한 문자열로 반환합니다.
  • JoinPoint.toString() : 조언되는 방법에 대한 유용한 설명을 인쇄합니다.