SPRING FRAMEWORK

[Finally Spring] 4. AOP 개념과 코드구현

yunjuniverse 2022. 8. 15. 01:39

요약

  1. AOP는 OOP의 클래스 단위로 객체를 나누어 불필요한 중복이 발생하는 단점을 극복하기 위해 핵심기능과 부가기능을 기준으로 모듈화한다.
  2. 핵심기능(Core Concerns)은 비즈니스 로직과 관련된 모듈이며, 부가기능(횡단관심사, Cross-cutting Concerns)은 핵심 기능에 공통적으로 필요한 모듈이다.
  3. 부가기능은 반드시 핵심기능과 함께 사용되며, 핵심 기능과 합쳐져 하나의 객체처럼 사용한다.
  4. 부가기능을 분리해 객체를 가볍고 간결하게 만들며, 불필요한 반복을 방지한다.

 

AOP(Aspect-Oriented Programming)

관점지향 프로그래밍. 애플리케이션을 구성하는 모듈을 나누는 기준을 기능이 아닌 ‘관심사 관점’으로 전환하여 나누는 기법. 개별 객체의 공통된 관심사횡단 관심사(croess-cutting concerns)로 두어 객체를 가볍고 깔끔하게 만드는 프로그래밍 패러다임입니다. 즉, 모듈화의 기준을 비즈니스 로직과 객체에 공통적으로 속하는 부가기능 관점으로 나누는 방법론이 AOP입니다. (실제 코드에서는 Advice로 명명하여 횡단 관심사를 분리합니다.)

 

우리가 AOP를 사용하는 목적을 한마디로 정의하자면, '가벼운 객체, 높은 가독성'입니다. 객체 간 중복코드를 최소화하기 위해 중복코드를 공통(횡단)관심사로 분리하여 비즈니스 로직에 집중할 수 있도록 하는 방법입니다. (일반적으로 비즈니스 로직을 소유하는 객체는 비즈니스 로직만 가지는 것이 좋습니다.)

 

실제 코드 상에서는

1. 횡단 관심사를 어드바이스(Advice)로 두고,

2. 객체에 AOP 적용 시점을 의미하는 조인 포인트(Join Point) 설정해줍니다. (조인 포인트는 객체 내부 메서드 실행 전(S)과 후(E)로 나뉩니다)

3. 이 조인 포인트 중 특정 메서드만 AOP가 적용되도록 선별하는 포인트컷(Pointcut)을 특정 메서드에 지정해줍니다. 즉, 포인트 컷(Pointcut)은 어떤 조인 포인트에 Advice를 적용할지 결정해주는 것입니다.

4. 포인트컷으로 결정한 객체의 조인 포인트에 어드바이스를 적용합니다. 이를 위빙(Weaving)이라고 합니다.

 

이 과정에서 나온 주요 개념을 정리해보죠.

 

AOP의 주요 개념 및 용어 정리

  1. Core Concerns(핵심 기능): 비즈니스 로직에 관련한 기능
  2. Cross-cutting Concerns(부가 기능, 횡단관심사): 핵심 기능에 포함되지 않는 부가적인 기능(로그, 보안, 트랜잭션 등) 부가 기능은 반드시 비즈니스 로직이 담긴 핵심 기능과 함께 사용
  3. Aspect(관점): 목표 기능이 핵심 기능에 속하는지 부가 기능에 속하는지를 나누는 기준. 부가 기능을 정의한 코드인 어드바이스(Advice)와 어드바이스를 어느 핵심 기능에 적용할지 결정하는 포인트컷을 합친 개념 (Advice + Pointcut → Apsect)
  4. Advice(어드바이스, 부가기능 모듈): 조인포인트에서 수행되는 코드, Apsect를 언제 핵심 코드에 적용할 지 정의함. 부가기능에 해당. 시스템 전체 관점(Aspect)에 API 호출 제공
  5. Join Point(조인 포인트): 어드바이스가 적용될 포인트. AOP를 적용할 수 있는 모든 지점. 클래스 초기화, 객체 인스턴스화, 메소드 호출, 필드접근, 예외 발생과 같은 애플리케이션 실행 흐름에서 특정 포인트를 의미함. 메서드 실행 전(S), 메서드 실행 후(E)로 나뉨. 부가 기능에 해당하는 동작을 조인 포인트에 관심 코드(Aspect code)로 추가할 수 있음. 횡단 관심은 조인포인트 전 후에 AOP에 의해 자동으로 추가됨. 어드바이스 적용이 필요한 곳은 애플리케이션 내에 메서드를 포함
  6. Pointcut(포인트컷): 조인 포인트에서 어드바이스에 적용될 위치를 선별하는 기능, 주로 AspectJ 표현식을 사용해서 지정. 프록시 패턴을 사용하는 스프링 AOP는 메서드 실행 지점만 포인트컷으로 선별 가능
  7. Target(타겟, 핵심기능 모듈): 핵심 기능을 담고 있는 모듈로 타겟은 부가기능을 부여할 대상이 됨. Advice를 받는 객체이며 포인트컷으로 결정
  8. Weaving(위빙): 포인트컷으로 결정한 타겟의 조인 포인트에 어드바이스를 적용하는 것. Advice를 핵심코드에 적용하는 것을 의미. 핵심기능의 코드에 영향을 주지않고 부가기능 추가 가능함. AOP 적용을 위해 Aspect 객체에 연결한 상태(언제 연결하느냐에 따라 컴파일 타임, 로드 타임, 런타임으로 구분)
  9. AOP Proxy(AOP 프록시): AOP 기능을 구현하기 위해 만든 프록시 객체로 스프링에서는 JDK 동적 프록시 또는 CGLIB 프록시 사용. AOP 프록시는 런타임에서만 위빙(Weaving)
  10. Advisor(어드바이저): 하나의 어드바이스와 하나의 포인트컷으로 구성(Advice + Pointcut)

 

만약 AOP를 적용하지 않는다면? (문제점)

  1. 비즈니스 로직이 포함된 객체에 부가 기능에 해당하는 트랜잭션, 보안, 로깅 등의 코드가 존재해 객체가 무거워집니다.
  2. 부가 기능이 객체마다 존재해 프로그램 자체가 느리고 무거워집니다.
  3. 코드 간결성이 떨어집니다. (비즈니스 로직 파악이 어려워 생산성이 떨어집니다.)