[Spring] Spring AOP(Aspect-Oriented Programming) 개념

2022. 10. 30. 16:10JAVA/Spring

1. 스프링 AOP(Aspect-oriented Programming)

  • AOP(Aspect-oriented Programming)은 OOP를 보완하는 수단
  • 흩어진 Aspect를 모듈화 할 수 있는 프로그래밍 기법

 

흩어진 관심사(Crosscutting Concerns)

  • 위 그림에서 각각의 색깔들의 의미는 여러 클래스, 여러 메소드에 나타나는 비슷한 코드, 비슷한 필드 주입, 비슷한 메서드 호출일 수 잇습니다.
  • 대표적인 사례가 데이터베이스에 접근하기 위한 코드들은 트랜잭션 코드들로 감싸야 합니다. 이러한 경우에 AOP를 적용할 수 있습니다.
  • 각각의 색깔이 메서드라고 가정한다면 파란 색메서드는 Class A, Class B에 사용됨, 노랑은 Class A, B, C에 사용됨, 빨강은 Class A, C에 사용됨
  • 노란색 메서드의 경우 기능 내용은 같으나 각각의 클래스에서 수행하는 위치가 다름

 

2. AOP의 필요성

여러 클래스, 메서드에 공통적으로 들어가는 코드가 존재할 때 이 공통적인 코드를 수정하는 경우에 이 코드가 들어간 모든 코드를 수정해야 하는 문제점이 발생합니다. 더불어 핵심적인 구현 소스 코드파일도 수정해야 한다는 문제점도 발생합니다.

 

3. AOP의 적용

AOP를 적용하면 다음과 같이 표현할 수 있습니다.

  • Aspect Y는 파란색 코드를 수행하고 이 파란색 코드를 A, B에 적용하는지 알려줍니다.
  • 소스 코드 구현을 건드리지 않고 Aspect를 수정할 수 있음

 

4. AOP의 주요 개념

  • Aspect와 Target
    • Aspect : 여러 객체에 공통으로 적용되는 기능. 트랜잭션이나 보안 등이 Aspect의 대표적인 사례.
    • Target : Aspect가 적용되는 대상을 의미함
  • Advice : 언제 공통 관심 기능을 핵심 로직에 적용할 지를 정의한 로직. 예를 들어 ‘메서드를 호출하기전’(언제)에 ‘트랜잭션 시작’(공통 기능) 기능을 적용한다는 것을 정의함.
  • Join point와 Pointcut
    • Join point : Advice를 적용 가능한 지점을 의미함. 메서드 호출, 필드 값 변경 등이 Join Point에 해당하며, 스프링은 프록시를 이용해서 AOP를 구현하기 때문에 메서드 호출에 대한 Join Point만 지원함.
    • Pointcut : Joint Point의 부분 집합으로서 실제로 Advice가 적용되는 Join Point를 나타냄. 스프링에서는 정규 표현식이나 AspectJ의 문법을 이용하여 Pointcut을 정의할 수 있음. 즉, Joint Point는 적용 가능한 스펙에 가깝고 Pointcut은 실제 해당 advice가 적용되는 위치라 할 수 있다.

 

5. AOP 구현체

 

6. AOP 적용 방법

  • 컴파일 파일 시점에 적용
    • 컴파일 시점에 바이트 코드를 조작하여 적용
    • 컴파일에 적용하기 때문에 로드타임과 런타임때 성능적인 부하가 없음
    • 별도의 컴파일링 과정이 필요
  • 로드 타임 시점에 적용
    • 컴파일한 클래스 파일을 조작하지 않고 클래스를 로딩하는 시점에 조작하여 적용 (Load Time Weaving)
    • 클래스 로딩 시점에 약간의 부하가 발생함
    • 로드 타임 위버 설정 필요
  • 런타임 시점에 적용 (스프링 AOP가 적용하는 방법)
    • 등록한 빈의 프록시 빈을 생성하여 프록시 빈이 Aspect 모듈과 등록한 빈의 기능을 수행하도록 합니다.
    • 최초 빈을 생성할때만 비용이 들어감
    • 별도의 컴파일러, 로드 타임 위버 설정 불필요
    • AOP 적용 문법이 쉬움

 

References

AOP에 대해 아라보자! - 1부
[인프런] 스프링 프레임워크 핵심 기술