Skip to content

Latest commit

 

History

History
180 lines (128 loc) · 7.93 KB

README.md

File metadata and controls

180 lines (128 loc) · 7.93 KB

Spring AOP란


  • Aspect Oriented Programming의 약자로 관점 지향 프로그래밍의 한 형태
  • 애플리케이션의 핵심 기능과는 별개로 횡단 관심사(부가 기능)을 모듈화하여 코드의 재사용성, 유지보수성, 가독성을 향상시킬 수 있는 프로그래밍의 방법론 중 하나
  • 횡단 관심사의 경우 보안, 로깅, 트랜잭션 관리 등 각각 모듈에서 반복적으로 발생하는 부가 기능을 뜻함
    • 횡단 관심사 : 애플리케이션에서 코드가 중복되고, 강력하게 결합되어 있어 다른 로직과 분리할 수 없는 애플리케이션 로직
  • 프록시를 통해 구현, 스프링에서는 CGLIB, JDK 프록시를 통해 생성된 프록시 객체를 통해 AOP를 구현
    • 현재는 CGLIB를 주로 사용하고 있다.


AOP 동작원리


Spring IOC Container

  • Spring IOC는 Spring Framework의 핵심 개념 중 하나로 제어의 역전(Inversion of Control)이라고 함
  • 객체의 생성과 생명주기 관리를 개발자가 직접 하는 것이 아닌, 프레임워크가 담당하도록 하여 애플리케이션의 결합도를 낮추고 유연성을 높임

빈 후 처리기란(BeanPostProcessor)

  • 빈 후 처리기는 Spring 컨테이너가 bean을 생성하고 초기화한 후에 추가적인 처리를 할 수 있는 방법을 제공
  • 빈 후 처리기를 사용하면 모든 bean의 초기화 전후에 원하는 로직을 삽입할 수 있음
  • 스프링이 빈 저장소에 등록할 목적으로 생성한 객체를 빈 저장소에 등록하기 직전에 조작하고 싶다면 빈 후처리기를 사용

Spring AOP 동작원리

  • 스프링이 스프링 빈 대상이 되는 객체를 생성한다.
  • 전달된 객체를 빈에 등록하기 전 빈 후 처리기에 전달한다.
  • AnnotationAwareAspectJAutoProxyCreator 같은 후 처리기가 빈이 AOP 대상 여부인지 확인한다.
  • 프록시 적용 대상이면 프록시를 생성하고 반환해서 프록시를 스프링 빈으로 등록한다.
  • 프록시는 원본 객체에 대한 참조를 유지하며, 메서드 호출을 가로채고 AOP 어드바이스(Advice)를 적용할 수 있도록 한다.
  • 만약 프록 시 적용 대상이 아니라면 원본 객체를 반환해서 원본 객체를 스프링 빈으로 등록한다.


용어 정리


포인트컷(PointCut)

  • 어드바이스가 실행될 지점을 지정하는데 사용
  • 부가기능을 어디에 적용할지 & 적용 안할지를 필터링 하는 로직

어드바이스(Advice)

  • 결합 지점(Join Point)에 적용되는 코드의 일부분
  • 코드의 일부분이란 관심사를 구현하며 주로 부가 기능을 처리하기 위한 로직이 포함됨
  • 프록시가 호출하는 부가 기능을 의미

어드바이저(Advisor)

  • 어떤 결합 지점(Join Point)에 어떤 어드바이스(Advice)를 적용할지 결정하는 역할
  • 하나의 포인트 컷과 하나의 어드바이스를 가지고 있는 것
  • 이 둘을 결합하여 결합 지점에서 어드바이스가 실행될 조건을 정의

조인 포인트(Join point)

  • 조인 포인트는 추상적인 개념으로, AOP를 적용할 수 있는 모든 지점을 의미한다.
  • 스프링 AOP의 경우 프록시 방식으로 동작하기 때문에 조인 포인트는 항상 메소드 실행 지점으로 제한된다.
    • AssertJ의 경우 메소드 실행, 생성자 호출, 필드값 접근, static 메서드 접근 등과 같은 포인트에서도 사용 가능하다.

타겟(Target)

  • 어드바이스를 받는 객체를 의미하며, 포인트 컷으로 결정된다.
  • 부가 기능을 적용받는 객체, 애플리케이션에서 정의된 일반적인 객체

애스팩트(Aspect)

  • 어드바이스 + 포인트컷을 모듈화한 것
  • @Aspect
  • 여러 어드바이스와 포인트컷이 함께 존재할 수 있다.



- 스프링 AOP의 경우 스프링 빈에 등록해야 AOP가 적용된다.
- 애스펙트를 사용한 프로그래밍 방식을 관점 지향 프로그래밍 AOP(Aspect-Oriented Programming)이다.
- AOP를 통해 횡단 관심사를 깔끔하게 처리하여 실제 코드에서는 비즈니스 로직을 더 집중할 수 있게 만들어주었다.

빈 후처리기(BeanPostProcessor)

  • 생성된 빈 객체를 스프링 컨테이너에 등록하기 전에 조작하는 객체
  • 빈을 생성한 후에 추가적인 작업을 처리하는 용도로 사용
  • AOP를 구현하는데 빈 후처리기를 사용하여 해당 빈이 생성될 때 AOP를 적용시켜 횐단 관심사를 처리하는 용도로 사용 가능

AOP 적용 방식

  1. 컴파일 시점
  2. 클래스 로딩 시점
  3. 런타임 시점

런타임 시점

  • 컴파일 후 자바가 실행되고 난 다음 시점을 말한다.
  • 프록시를 통해 스프링 빈에 부가 기능을 적용하는 작업을 말한다. (프록시 방식의 AOP)
  • 환경 설정을 위한 부가 작업 없이, 스프링만 있다면 AOP 사용이 가능하다.
  • 주로 사용하는 방식이 런타임 시점에서의 프록시 방식의 AOP이다.
  • 스프링은 AspectJ의 문법 기반의 프록시 방식의 AOP를 적용한다. (AspectJ를 직접 사용 X)
implementation 'org.springframework.boot:spring-boot-starter-aop'
  • 해당 의존성 추가를 통해 Spring AOP를 사용할 수 있다.(기본적으로 제공하는 AspectJ랑은 다르다.)

Spring에서 제공하는 어드바이스 종류

  • @Around : 메서드 호출 전후에 수행, 가장 강력한 어드바이스, 조인 포인트 실행 여부 선택, 반환 값 변환, 예외 변환 등이 가능
  • @Before : 조인 포인트 실행 이전에 실행
  • @AfterReturning : 조인 포인트가 정상 완료후 실행
  • @AfterThrowing : 메서드가 예외를 던지는 경우 실행
  • @After : 조인 포인트가 정상 또는 예외에 관계없이 실행(finally)

@Around에 모든 작업을 다 처리할 수 있지만 상황에 따른 코드를 분리해서 적용시키고 싶을 경우 다른 어노테이션을 통해 상황에 맞는 처리 작업을 정의할 수 있다.


ProceedingJoinPoint

  • 스프링 AOP에서 사용되는 인터페이스 중 하나
  • JoinPoint를 확장하여 Around 어드바이스에서 메서드 실행을 제어할 수 있다.
  • ProceedingJoinPoint를 사용하여 대상 메서드를 직접 호출하고 그 결과를 반환 & 예외처리 등을 할 수 있다.

JoinPoint 인터페이스 주요 기능

  • getArgs() : 메서드 인수 반환
  • getThis() : 프록시 객체 반환
  • getTarget() : 대상 객체 반환
  • getSignature() : 조언되는 메서드 설명 반환
  • toString() : 조언되는 방법에 대한 유용한 설명 인쇄

ProceedingJoinPoint 인터페이스의 주요 기능

  • proceed() : 다음 어드바이스나 타켓을 호출한다.

AspectJ 포인트컷 표현식

  • execution : 메서드 실행 조인 포인트를 매칭 한다. 스프링 AOP에서 가장 많이 사용하며, 기능도 복잡하다.
  • within : 특정 타입 내의 조인 포인트를 매칭한다.
  • args : 인자가 주어진 타입의 인스턴스인 조인 포인트
  • this : 스프링 빈 객체(스프링 AOP 프록시)를 대상으로 하는 조인 포인트
  • target : Target 객체(스프링 AOP 프록시가 가리키는 실제 대상)를 대상으로 하는 조인 포인트
  • @target : 실행 객체의 클래스에 주어진 타입의 어노테이션이 있는 조인 포인트
  • @within : 주어진 어노테이션이 있는 타입 내 조인 포인트
  • @annotation : 메서드가 주어진 어노테이션을 가지고 있는 조인 포인트를 매칭
  • @args : 전달된 실제 인수의 런타임 타입이 주어진 타입의 어노테이션을 갖는 조인 포인트
  • bean : 스프링 전용 포인트컷 지시자로 빈의 이름으로 포인트컷을 지정한다.