AOP

관점 지향 프로그래밍으로서 공통된 로직을 추출하여 메소드의 다양한 시점에 실행할 수 있게 해줄수 있으며, 코드를 줄여주고, 개발자가 공통 로직을 배제하고 핵심 관심사에 집중할 수 있도록 해준다.

AOP란?

  • 좋은 개발환경의 주요 원칙은 개발자가 비즈니스 로직에만 집중할 수 있게 한다 는 것이다

    • 이 목표를 위해 몇가지 중요한 원칙이 있지만, 가장 쉽게 생각할 수 있는 것은 반복적인 코드의 제거 라고 할 수 있다

    • 스프링 프레임워크는 이러한 반복적인 코드를 줄이고, 핵심 비즈니스 로직에만 집중할 수 있는 방법을 제공한다

  • 대부분의 시스템이 공통적으로 가지고 있는 보안, 로그, 트랜잭션과 같이 비즈니스 로직은 아니지만, 반드시 처리가 필요한 부분을 스프링에서는 횡단 관심사 (cross-concern) 이라고 한다

    • 스프링은 이러한 횡단 관심사를 분리해서 제작하는 것이 가능하다

    • AOP 는 이러한 횡단 관심사를 모듈로 분리하는 프로그래밍의 패러다임이다

  • AOP 기법에서는 핵심 로직을 구현한 코드에서 공통 기능을 직접적으로 호출하지 않는다

    • 핵심 로직을 구현한 코드를 컴파일하거나, 컴파일 된 클래스를 로딩하거나, 로딩한 클래스의 객체를 생성 할 때 AOP가 적용되어 핵심 로직 구현 코드안에 공통 기능이 삽입된다

      • 공통 기능이 변경되더라도 핵심 로직을 구현한 코드를 변경할 필요가 없다

AOP의 장점

  1. 개발자는 핵심 비즈니스 로직에만 집중해서 코드를 개발할 수 있게 되었고,

  2. 각 프로젝트마다 다른 관심사를 적용할 때 코드의 수정을 최소화 시킬 수 있고,

  3. 원하는 관심사의 유지보수가 수월한 코드를 구성할 수 있다

AOP 용어

    • Target

      • 핵심 기능을 담고 있는 모듈로, 부가 기능을 부여할 대상이 된다

    • Advice

      • 타겟에 제공할 부가기능을 정의

      • Advice의 종류

        • Around

          • Target의 method가 호출되기 이전(before) 시점과 이후(after) 시점에 모두 처리해야 할 필요가 있는 부가기능을 정의한다

          • Joinpoint 앞과 뒤에 실행돠는 Advice

        • Before

          • Target의 method가 실행되기 이전(before) 시점에 처리해야 할 필요가 있는 부가기능을 정의

          • Joinpoint 앞에서 실행되는 Advice

        • After Returning

          • Target의 method가 정상적으로 실행된 이후(after) 시점에 처리할 필요가 있는 부가기능을 정의

          • Jointpoint method 호출이 정상적으로 종료된 뒤에 실행되는 Advice

        • After Throwing

          • Target의 method가 예외를 발생한 이후(after) 시점에 처리해야 할 필요가 있는 부가기능을 정의

          • 예외가 throw 될 때 실행되는 Advice

    • JoinPoint

      • 어드바이스가 적용될 수 있는 위치

      • 타겟 객체가 구현한 인터페이스의 모든 method는 조인 포인트가 된다

    • Pointcut

      • 어드바이스를 적용할 타겟메서드를 선별하는 정규표현식

        • Advice를 어디에 적용할지를 결정!

      • 포인트컷 표현식은 execution 으로 시작하고, method의 signature를 비교하는 방법이 주요 사용된다

    • Weaving

      • Pointcut에 의해서 결정된 target의 jointpoint에 부가기능 (advice)를 삽입하는 과정을 뜻한다

      • Weaving은 AOP가 핵심기능 (target)의 코드에 영향을 주지 않으면서 필요한 부가기능 (advice)를 추가할 수 있도록 해주는 핵심적인 처리과정이다

    • Aspect

      • AOP의 기본 module

      • Aspect = Advice + Pointcut

      • Aspect는 singleton의 형태의 객체로 존재한다

      • AOP 개념을 적용하면 핵심기능 코드 사이에 침투된 부가기능을 독립적인 aspect 로 구분해 낼 수 있다

        • 구분된 부가기능 aspect를 runtime 시에 필요한 위치에 동적으로 참여하게 할 수 있다

    • Advisor

      • Advisor = Advice + Pointcut

      • Advisor는 Spring AOP에서만 사용되는 특별한 용어이다

Last updated