본문 바로가기

Spring/개념

[Spring] AOP

AOP

부가기능을 똑 떼어서, 재사용하기 위한 것이다.

 

인프라 로직 (부가기능)

  • 애플리케이션의 전 영역에서 나타날 수 있다
  • 중복 코드를 만들어 낼 가능성 - 유지보수 힘들어짐
  • 비즈니스 로직과 함께 있으면, 비즈니스 로직을 이해하기 어려워진다

 

비즈니스 로직 위에 횡단으로(가로로) 같은 로직들이 위치해있기 때문에, 인프라 로직은 횡단 관심사라고도 불린다.

 

AOP (Aspect Oriented Programming)

관점 지향 프로그래밍. 즉, 횡단 관심사에 따라 프로그래밍 한다고 생각하면 된다.

자바에서는 AspectJ 라는 구현체로 AOP가 구현되어있다.

 

부가기능을 똑 떼어서, 재사용하기 위한 것이다.

그럼, 1. 어떤 부가기능을, 2. 언제, 3. 어디에 사용해야할까?

 

1번과 2번 -> Advice로 정의됨

3번 -> Join point, Pointcut으로 정의됨

 

 

AOP 용어

  • Target (위치 관점)
    • 어떤 대상에 부가기능을 부여할 것인가
  • Advice (기능 관점)
    • 1. 어떤 부가기능을 2. 언제 사용할지? (Before, AfterReturning, AfterThrowing, After, Around)
    • Before : 메서드가 실행되기 전
    • AfterReturning : 메서드가 정상적으로 실행된 후
    • AfterThrowing : 메서드가 익셉션을 내뱉은 후
    • After : 정상적이든, 익셉션을 내뱉든 간에 어쨌든 메서드가 실행되고 난 후
    • Around : 메서드의 실행 전, 후. 시간측정 로직을 생각하면 된다

Advice의 5가지 종류

 

  • Join point
    • 어디에 적용할 것인가?(= Advice가 적용될 수 있는 위치)   메서드, 필드, 객체, 생성자 등
    • Spring AOP에서는, 부가기능을 적용하는 시점을 "메서드가 실행될 때" 만으로 한정하고 있다.
  • Point cut
    • Advice를 적용할 Join point를 선별하는 작업. (즉, 원하는 곳에만 적용하고 싶으니까 원하는 곳(메서드)를 선택하는 과정)
    • Spring AOP에서는 (부가기능을 적용하는 시점이 "메서드가 실행될 때" 이므로) advice가 적용될 메서드를 선정

 

Advice, Point cut, Join point에 대한 설명

 

 

AOP의 구현방법

  • 컴파일
    • J.java -> J.class 로 컴파일 될 때, 해당하는 Aspect들을 끼워넣어주는 것.
  • 클래스 로드 시
    • J.class 라는 명령어 집합을, 클래스 로더가 메모리에 올릴 때 그때 AOP를 적용시키는 것
  • 프록시 패턴 (Spring AOP)
    • J라는 타겟 클래스를 부가기능을 제공하는 프록시로 감싸서 AOP를 제공(런타임 시점에 프록시 객체 생성)
      • 프록시는 메서드 오버라이딩 개념으로 동작하므로, 스프링 AOP는 메서드 실행 시점에만 AOP를 적용할 수 있다
    • Spring에서 IoC, DI를 제공하기 때문에 가능한 방식
      • 따라서, 스프링 AOP는 스프링 컨테이너가 관리할 수 있는 빈에만 AOP를 적용할 수 있다!
    • AspectJ를 직접 사용하는 것이 아니라, AspectJ의 문법을 차용하고 프록시 방식의 AOP 적용

 

예시)

AuthController가 AuthService를 의존하는 형태였다면, 

Spring AOP가 적용되면, 런타임에 프록시 객체가 생성되고, AuthController가 해당 객체를 의존하도록 한다.

 

여기서 잠깐, 프록시란?

자신이, 클라이언트가 사용하려고하는 실제 대상인 것처럼 위장해서 클라이언트의 요청을 받아주는 것을 말한다(대리인, 대리자).

클라이언트와 타깃 사이에 프록시가 생성됨

사용 목적에 따라 2가지로 나뉜다

1. 클라이언트가 타깃에 접근하는 방법을 제어하기 위해서 -> 프록시 패턴

2. 타깃에 부가적인 기능을 부여해주기 위해서 -> 데코레이터 패턴

 

 

Transactional, Interceptor, Filter

AOP의 일종

 

 

 

자기(타겟 오브젝트)가 자기의 메서드를 실행할 때는, AOP가 적용이 안된다.

이때는, 프록시 객체의 메서드를 실행하는 것이 아닌 그냥 원래 자신의 메서드를 실행한다.

 

'Spring > 개념' 카테고리의 다른 글

[Spring] 컨테이너, IoC, DI, Bean  (0) 2022.09.18