Spring

Spring AOP, 관점 지향 프로그래밍

Karla Ko 2023. 9. 14. 03:52
728x90

AOP

  • Aspect-Oriented Programming
  • 관점지향 프로그래밍은 객체지향 프로그래밍을 보완하기 위해 쓰임
  • 핵심 로직과 부가 기능을 분리하여 애플리케이션 전체에 걸쳐 사용되는 부가 기능을 모듈화하여 재사용할 수 있도록 지원하는 것

  • 보통 비즈니스 웹 애플리케이션이라면 사업에 핵심적인 핵심 비즈니스 로직
  • 횡단 관심사(cross-cutting concerns):  애플리케이션 전체를 관통하는 부가 기능 로직 (로깅, 보안, 트랜젝션)
관점 == 관심사( 개발에 필요한 고민이나 염두에 두어야 하는 일)
- 파라미터가 올바르게 들어왔을까?
- 이 작업을 하는 사용자가 적절한 권한을 가진 사용자인가?
- 이 작업에 발생할 수 있는 모든 예외는 어떻게 처리해야 하는가?
핵심 로직은 아니지만, 코드를 온전하게 만들기 위해서 필요한 고민들 ( 반복적으로 코드에 반영)

나눗셈
- 핵심로직 : 두 개의 숫자를 나누는 것
- 주변로직 : 0을 나누는 것이 아닌지 체크 ('관심사' == '주변로직')
  • AOP가 추구하는 것은 '관심사의 분리'
  • AOP는 과거에 개발자가 작성했던 '관심사 + 비즈니스 로직'을 분리해서 별도의 코드로 작성하고, 실행할 때 이를 결합하는 방식으로 접근
  • AOP는 개발자가 염두에 두어야 하는 일들은 별도의 '관심사'로 분리하고, 핵심 비즈니스 로직만 작성할 것을 권장
  • 횡단 관심사의 코드를 핵심 비즈니스 로직의 코드와 분리하여, 코드의 간결성을 높이고 변경에 유연함과 무한한 확장이 가능하도록 하는 것이 AOP의 목적
OOP : 비즈니스 로직의 모듈화
 - 모듈화의 핵심 단위는 비즈니스 로직

AOP : 인프라 혹은 부가기능의 모듈화
 - 대표적인 예 : 모니터링 및 로깅, 동기화, 오류 검사 및 처리, 성능 최적화(캐싱) 등
 - 각각의 모듈들의 주 목적 외에 필요한 부가적인 기능들

 

AOP 적용 방식

컴파일 시점

  • .java 파일을 컴파일러를 통해 .class를 만드는 시점에 부가 기능 로직을 추가하는 방식
  • 모든 지점에 적용 가능
  • AspectJ가 제공하는 특별한 컴파일러를 사용해야 하기 때문에 특별할 컴파일러가 필요한 점과 복잡하다는 단점

클래스 로딩 시점

  • .class 파일을 JVM 내부의 클래스 로더에 보관하기 전에 조작하여 부가 기능 로직 추가하는 방식
  • 모든 지점에 적용 가능
  • 특별한 옵션과 클래스 로더 조작기를 지정해야하므로 운영하기 어려움

런타임 시점

  • 스프링이 사용하는 방식
  • 컴파일이 끝나고 클래스 로더에 이미 다 올라가 자바가 실행된 다음에 동작하는 런타임 방식
  • 실제 대상 코드는 그대로 유지되고 프록시를 통해 부가 기능이 적용
  • 프록시는 메서드 오버라이딩 개념으로 동작하기 때문에 메서드에만 적용 가능 → 스프링 빈에만 AOP를 적용 가능
  • 특별한 컴파일러나, 복잡한 옵션, 클래스 로더 조작기를 사용하지 않아도 스프링만 있으면 AOP를 적용할 수 있기 때문에 스프링 AOP는 런타임 방식을 사용

 

AOP 용어 및 개념

Target

  • 개발자가 작성한 해심 비즈니스 로직을 가지는 객체
  • advice의 대상이 되는 객체
  • Pointcut으로 결정

advice

  • 실질적인 부가 기능 로직을 정의하는 곳
  • 특정 조인 포인트에서 Aspect에 의해 취해지는 조치
  • 그 동작 위치에 따라 구분
Type 설명
Before 조인포인트 실행 이전에 실행, 일반적으로 리턴타입 void
After returning 조인포인트 완료후 실행 (ex. 메서드가 예외없이 실행될 때)
After Throwing 메서드가 예외를 던지는 경우 실행
After (finally) 조인포인트의 동작과 관계없이 실행
Around 메서드 호출 전후에 수행(조인포인트 실행 여부 선택, 반환 값 변환, 예외 변환, try~catch~finally 구문 처리 가능 등)
가장 강력한 어드바이스

Join point

  • advice가 적용될 수 있는 모든 위치
  • Target 객체가 가진 메서드
  • ex) 메서드 실행 시점, 생성자 호출 시점, 필드 값 접근 시점
  • 스프링 AOP는 프록시 방식을 사용하므로 조인 포인트는 항상 메서드 실행 지점

Pointcut

  • 조인 포인트 중에서 advice가 적용될 위치를 선별하는 기능
  • 스프링 AOP는 프록시 기반이기 때문에 조인 포인트가 메서드 실행 시점 뿐이 없고 포인트컷도 메서드 실행 시점만 가능
  • 관심사와 비즈니스 로직이 결합되는 지점을 결정하는 것

Aspect

  • 추상적인 개념
  • advice + pointcut을 모듈화 한 애플리케이션의 횡단 기능

Advisor

  • 스프링 AOP에서만 쓰는 용어로, 하나의 어드바이스와 하나의 포인트컷으로 구성된 에스팩트를 특별하게 지칭하는 말

Proxy

  • Target을 전체적으로 감싸고 있는 존재
  • AOP 기능을 구현하기 위해 만든 프록시 객체
  • 스프링에서 AOP 프록시는 JDK 동적 프록시 또는 CGLIB 프록시
  • 스프링 AOP의 기본값은 CGLIB 프록시
728x90