스프링과 AOP

테크·2023년 1월 4일
0

Spring

목록 보기
1/1
post-thumbnail

AOP란?

AOP

AOP는 관점 지향 프로그래밍(Aspect-Oriented Programming)의 약자이다. AOP는 횡단 관심사(cross-cutting concern)의 분리를 허용함으로써 모듈성을 증가시키는 것이 목적인 프로그래밍 패러다임이다
- 관점 지향 프로그래밍 wikipedia

횡단 관심사는 전체 코드에서 중복되어 나타나는, 로직과 강하게 결합되어 추상화를 어렵게 하는 로직을 말합니다.
대표적인 예로 로깅이 있는데 로깅 로직이 수정되면 로깅을 사용하는 모든 애플리케이션 로직의 수정이 필요해지므로 로깅은 애플리케이션 전체를 횡단하는 횡단 관심사입니다.

AOPOOP와 상호 보완적인 관계로서 AOP를 이용하면 애플리케이션의 핵심적인 로직과 로깅과 같은 부차적인 로직을 분리할 수 있어 더욱 효율적으로 애플리케이션을 개발할 수 있습니다.

AOP 주요 키워드

  • Joinpoint: AOP를 사용해 추가 로직을 삽입할 수 있는 애플리케이션의 특정 지점을 의미합니다. 메서드 호출지점, 생성자 호출시점, 메서드 반환지점 등 다양한 지점이 있습니다.
  • Pointcut: Joinpoint의 모음입니다. 조인포인트에 여러 제약을 가하거나(메서드를 특정한 이름으로 필터링 etc..) 조인포인트를 모아 더욱 상세한 Joinpoint를 구성할 수 있습니다
  • Advice: 특정 Jointpoint에 실행될 작업을 의미합니다. Jointpoint 이전에 실행되는 BeforeAdvice, 이후에 실행되는 AfterAdvice 등 여러 종류가 존재합니다.
  • Aspect: Advice와 Pointcut의 조합으로 애플리케이션 전체에 흩어져있는 관심사를 모듈화한 구현체입니다.
  • Weaving: 애플리케이션 코드의 적절한 위치에 Aspect를 삽입하는 과정을 뜻합니다. Compile-time weaving은 빌드 시점에 Weaving을 수행하고, Runtime weaving은 런타임에 동적으로 Weaving을 수행합니다. AspectJ에는 Load-time weaving 이라는 메커니즘도 존재하는데 JVM이 클래스 로더를 이용해 클래스를 로딩할 때 클래스의 바이트코드에 Weaving을 수행하는 메커니즘입니다.
  • Target: Advice가 부여될 대상을 의미합니다.

AOP의 종류

AOP는 정적 AOP동적 AOP의 두 가지 종류가 존재하는데 실제 Weaving이 일어나는 지점과 Weaving이 적용되는 방식으로 구분됩니다.

정적 AOP

애플리케이션의 빌드 단계에서 Weaving이 일어나는 방식으로 Compile-time weaving을 의미합니다. 빌드 시점에 이미 실행될 Advice의 위치가 결정되기 때문에 런타임에 추가적인 부하가 없는 방식입니다. 이 방식은 Aspect가 조금이라도 수정되면 애플리케이션을 전부 다시 컴파일해야 하는 단점이 있습니다.

동적 AOP

애플리케이션의 런타임에 Weaving이 일어나는 방식으로 Runtime weaving을 의미합니다. 스프링 AOP가 수행될 때 기본적으로 따르는 방식입니다. 구현 방식은 다양하지만 스프링에서는 Target을 Proxy로 제공해 필요에 따라 Advice를 호출하는 방식으로 구현되어 있습니다.

Spring AOP

Spring에서 AOP를 사용하려면 직접 ProxyFactory를 이용해 Proxy를 만들어 적용할 수도 있지만 Spring에서 제공하는 선언적인 AOP 구성 메커니즘(ProxyFactoryBean, aop, AspectJ 등...)을 이용해 만드는 게 가장 보편적입니다.

스프링 AOP의 핵심 메커니즘은 Proxy입니다. 스프링은 런타임에 빈을 등록할 때 빈 후처리기인 DefaultAdvisorAutoProxyCreator가 후처리기로 등록되어 있다면 아래와 같은 프로세스를 적용하여 빈을 Proxy로 등록합니다.

  1. 빈을 생성한다
  2. 스프링 컨테이너는 생성된 빈을 DefaultAdvisorAutoProxyCreator에게 건네준다
  3. 빈이 프록시 등록 대상인지 확인하여 (Pointcut 확인) 등록 대상이면 빈을 감싼 Proxy 객체를 만든다
  4. 생성된 Proxy 객체를 스프링 컨테이너에게 돌려준다
  5. 스프링 컨테이너는 돌려받은 객체를 Bean으로 등록한다

스프링 AOP의 한계점은 메서드 호출 Joinpoint만을 지원한다는 점입니다. 다른 기능이 추가적으로 필요하다면 AspectJ를 사용하여 구현하면 됩니다.

profile
공부하는 개발자

0개의 댓글

관련 채용 정보