0+ 스프링/0+ 스프링 AOP

[스프링 AOP] 개념

힘들면힘을내는쿼카 2023. 1. 30. 17:13
728x90
반응형

[스프링 AOP] 개념

스프링 핵심 원리 - 고급편 - 인프런 | 강의
이 글은 인프런에서 스프링 핵심 원리 - 고급편 강의를 참고하여 작성했습니다.

 

스프링 핵심 원리 - 고급편 - 인프런 | 강의

스프링의 핵심 원리와 고급 기술들을 깊이있게 학습하고, 스프링을 자신있게 사용할 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com

 

대부분 AOP 개념을 설명할 때 대표적으로 Cross-Cutting Concerns 이라는 말을 합니다.
횡단 관심사 정도로 할수 있습니다.
좀 더 쉽게 이야기 하면 👀 공통된 관심사 라고 이야기 할 수 있습니다...!

그렇다면 AOP가 등장하게 된 이유는 무엇일까요? 🤔

 

애플리케이션 로직은 크게 핵심 기능부가 기능으로 나눌 수 있습니다.

핵심 기능은 👨🏻‍💼비지니스 로직이라고 이해하면 쉽습니다. PaymentService의 핵심 기능은 결제 로직 입니다.

부가 기능핵심 기능을 보조하기 위해서 제공되는 기능입니다. PaymentService에서 사용되는 payment()메소드의 실행시간을 알고 싶으면 실행시간을 계산할수 있는 로직을 개발 할수 있습니다. 하지만 이러한 기능은 비지니스에는 관련이 없죠. 부가 기능은 이름 그대로 핵심 기능을 보조하기 위해서 존재 합니다.

그런데 부가 기능은 보통 여러 클래스에 걸쳐서 사용됩니다.
부가 기능은 핵심 기능을 보조하기 위해서 존재하기 때문이죠.
예를 들어서 모든 비지니스 로직에 메소드 실행 시간 추적을 해야한다고 합시다.(이러한 부가 기능은 횡단 관심사(cross-cutting concerns)가 됩니다.)

이런 부가 기능을 하나하나 모든 비지니스 로직에 적용하는것은 어려울 뿐만 아니라, 유지보수에도 어려움이 있습니다.
비지니스 로직이 10,000개라고 하면 10,000개에 동일한 부가 기능 코드를 추가해야 합니다.🙀
부가 기능을 수정해야 하면….? 생각만해도 어질어질 합니다.😵‍💫

AOP(Aspect-Oriented Programming) 두두등장

 

 

이러한 부가 기능 도입의 문제점을 해결하기 위해 선배 개발자분들은 오랜기간 고민해왔습니다. 

  • 부가 기능을 핵심 기능에서 분리하고 한 곳에서 관리
  • 부가 기능을 어디에 적용할지 선택

이렇게 부가 기능을 한곳에서 관리하고 어디에 적용할지 선택하는 기능을 합해서 하나의 모듈로 만들었는데,
이것이 바로 Aspect(관점) 입니다!
(Aspect: 부가 기능과, 해당 부가 기능을 어디에 적용할지 정의)

Aspect는 관점이라는 의미 인데, 애플리케이션을 👀바라보는 관점을 횡단 관심사 관점으로 보는 것 입니다.
이러한 프로그래밍 방식을 관점 지향 프로그래밍(Aspect-Oriented Programming) 라고 합니다.

참고로 AOPOOP를 대체하기 위한 것이 아니라
OOP가 횡단 관심사를 처리하기 어려운 부분을 보조하는 목적으로 개발되었습니다.

스프링 AOP 적용 방식

AOP를 사용하면 핵심 기능과 부가 기능이 코드상 완전히 분리되어서 관리 할수 있습니다.
🤔그렇다면 AOP는 어떤 방식으로 핵심 기능에 추가되는 걸까요?

  • 컴파일 시점
  • 클래스 로딩 시점
  • 런타임 시점(프록시)

위와같이 3가지 방법이 있습니다.
컴파일 시점, 클래스 로딩 시점은 해당 시점에 핵심 기능에 실제로 부가 기능 로직을 붙여 버린다고 생각하면 됩니다.

스프링은 위 2가지 방법을 사용하지 않고 런타임 시점(프록시)에 부가 기능을 적용합니다.
런타임 시점은 컴파일도 끝나고, 클래스 로더에 클래스도 다 올라가서 이미 java가 실행되고 난 다음을 말합니다.
(javamain 메소드가 이미 실행된 다음 입니다.)
따라서 java가 제공하는 범위 안에서 부가 기능을 적용해야 하는데,
스프링과 같은 컨테이너의 도움을 받고 프록시와 DI, 빈 포트스 프로세서 같은 개념을 총 동원 하여,
최종적으로 스프링 빈에 부가기능을 적용 할 수 있습니다.

프록시를 사용하기 때문에, 메소드 실행 지점에만 AOP를 적용할 수 있습니다.(프록시는 메소드 오버라이딩 개념으로 동작하기 때문입니다.)
정리하면 스프링 AOP의 조인 포인트는 메소드 실행으로 제한 됩니다.(조인 포인트는 아래 AOP 용어 정리에서 설명 하겠습니다.^^)

AOP 용어 정리

  • AOP 프록시
    • AOP 기능을 구현하기 위해 만든 프록시 객체
    • 스프링에서 AOP 프록시는 JDK 동적 프록시 또는 CGLIB 프록시
  • 어드바이스
    • 부가 기능
    • 특정 조인 포인트에서 Aspect에 의해 취해지는 조치
    • Around, Before, After 같은 다양한 종류의 어드바이스 존재
  • 조인 포인트
    • 어드바이스가 적용될 수 있는 위치(추상적 개념)
    • 컴파일 시점, 클래스 로딩 시점의 AOP를 사용하면 메소드 실행, 생성자 호출, 필드 값 접근, static 메소드 같은 프로그램 실행 중 지점 가능
    • 스프링 AOP는 프록시 방식을 사용하므로 조인 포인트는 항상 메소드 실행 지점으로 제한
  • 포인트컷
    • 조인 포인트(어드바이스가 적용될 위치)를 선택
    • 주로 AspectJ표현식을 사용해서 지정
    • 스프링 AOP는 프록시 방식을 사용하므로 조인 포인트는 항상 메소드 실행 지점으로 제한
  • 타겟
    • 어드바이스(부가 기능)를 받는 객체
    • 포인트컷(조인 포인트를 선택)으로 결정
  • 애스펙트
    • 어드바이스(부가 기능) + 포인트컷(조인 포인트 선택)을 모듈화
    • @Aspect
    • 여러 어드바이스와 포인트컷이 함께 존재
  • 어드바이저
    • 하나의 어드바이스(부가 기능)와 하나의 포인트컷(조인 포인트 선택)
    • 스프링 AOP에서만 사용되는 용어
  • 위빙
    • 포인트컷(조인 포인트를 선택)으로 결정한 타겟(어드바이스를 받는 객체)의 조인 포인트(어드바이스가 적용될 수 있는 위치)에 어드바이스를 적용
    • 위빙을 통해 핵심 기능에 영향을 주지 않고 부가 기능을 추가 할 수 있음
    • AOP 적용을 위해 애스펙트 객체에 연결한 상태
728x90
반응형