본문 바로가기
Spring Boot/Core

스프링 AOP

by Holy Moly 2022. 8. 1.

Spring AOP (Aspect-oriented Programming)

OOP를 보완하는 수단으로, 흩어진 Aspect를 모듈화 할 수 있는 프로그래밍 기법

 


흩어진 관심사 (Crosscutting Concerns)

Class A { Aspect X, Aspect Y, Aspect Z}

Class B { Aspect X, Aspect Y, Aspect Y}

Class C { Aspect X, Aspect Z}

 

 

각 클래스에서 중복된 관심사를 갖는 경우에 AOP를 적용하면


Aspect X {A,B,C}

Aspect Y {A,B}

Aspect Z {A,C}

 

다음과 같이 Aspect들로 모듈화 할 수 있다.


AOP 주요개념

  • Aspect와 Target
  • Advice(해야할 일들)
  • Join point와 Pointcut(어디에 적용해야 할 지)

 


AOP 구현체

  • 자바
    • AspectJ
    • 스프링 AOP

AOP 적용 방법

  • 컴파일
  • 로드 타임(Class는 이미 불러왔고, 이후 Aspect를 로드할 때)
  • 런타임

 

스프링 AOP : 프록시 기반 AOP

스프링 AOP 특징

  •  프록시 기반 AOP 구현체
  • 스프링 빈에만 AOP를 적용할 수 있다.
  • 모든 AOP 기능을 제공하는 것이 목적이 아니라, 스프링 IoC와 연동하여 엔터프라이즈 애플리케이션에서 가장 흔한 문제에 대한 해결책을 제공하는 것이 목적

 


프록시 패턴

  • 기존 코드 변경없이 접근 제어 또는 부가 기능 추가
    • proxy 객체가 target 객체를 참조하여 사용

 

문제점

  • 매번 프록시 클래스를 작성해야 하는가?
  • 여러 클래스, 여러 메소드를 적용하려면?
  • 객체들 관계가 복잡하면?

 


문제점을 해결하기 위한 스프링 AOP

  • 스프링 IoC 컨테이너가 제공하는 기반 시설과 동적 프록시(런타임간)를 사용하여 해결
  • 동적 프록시 : 동적으로 프록시 객체를 생성하는 방법
    • 자바가 제공하는 방법은 인터페이스 기반 프록시 생성
  • 스프링 IoC: 기존 빈을 대체하는 동적 프록시 빈을 만들어 등록 시켜준다.
    • 클라이언트 코드 변경 없음
    • AbstractAutoProxyCreator implements BeanPostProcessor
    • 자동으로 프록시 빈을 만들어줌

스프링 AOP: @AOP 어노테이션

애노테이션 기반의 스프링 AOP

 

의존성 추가

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

 

Aspect 정의

  • @Aspect
  • 빈으로 등록을 위한 @Component 추가

 

Pointcut 정의

  • @Pointcut(표현식)
  • 주요 표현식
    • execution
    • @annotaion
    • bean
  • 포인트컷 조합
    • &&, ||, !

 

Advice 정의

  • @Before // 메서드 시작 전
  • @AfterReturning // 반환 후
  • @AfterThrowing // 에러 후
  • @Around // 메서드를 감쌈 -> 다용도로 사용가능

 

'Spring Boot > Core' 카테고리의 다른 글

Null-safety  (0) 2022.08.01
SpEL  (0) 2022.07.30
데이터 바인딩 추상화  (0) 2022.07.26
Validation 추상화  (0) 2022.07.25
Resource 추상화  (0) 2022.07.25

댓글