1. AOP 소개

  □ AOP 소개
    ■ AOP (Aspect Oriented Programming)

      - 문제를 해결하기 위한 핵심 관심 사항(core concern, 핵심 로직)과 전체에 적용되는 공통 관심 사항(cross-cutting concern,
        공통 기능)을 기준으로 프로그래밍함으로써 공통 모듈을 여러 코드에 쉽게 적용할 수 있도록 해 줌.
    ■ 공통 관심 사항을 구쳔한 코드를 핵심 로직을 구현한 코드 안에 삽입

      - 핵심 로직을 구현한 코드에서 공통 기능을 직접적으로 호출하지 않음.
      - 핵심 로직을 구현한 코드를 컴파일하거나, 컴파일된 클래스를 로딩하거나, 로딩된 클래스의 객체를 생성할 때 AOP가 적용되어

        핵심 로직 구현 코드 안에 공통 기능이 삽입됨.
      - 공통 기능이 변경되더라도 핵심 로직을 구현한 코드를 변경할 필요가 없음.
        (공통 기능 코드를 변경한 뒤 핵심 로직 구현 코드에 적용만 하면 됨.)

  □ AOP 용어
    ■ Advice
      - 언제 공통 관심 기능을 핵심 로직에 적용할지를 정의.
      - 예로, '메서드를 호출하기 전'(언제)에 '트랜잭션을 시작한다'(공통 기능) 기능을 적용한다는 것을 정의.
    ■ Joinpoint
      - Advice를 적용 가능한 지점을 의미.
      - 메서드 호출, 필드 값 변경 등이 Joinpoint에 해당.
    ■ Pointcut
      - Joinpoint의 부분 집합으로써 실제로 Advice가 적용되는 Joinpoint를 나타냄.
      - 스프링에서는 정규 표현식으나 AspectJ의 문법을 이용하여 Pointcut을 정의.
    ■ Weaving
      - Advice를 핵심 로직 코드에 적용하는 것을 의미.
      - 공통 코드를 핵심 로직 코드에 삽입하는 것.
    ■ Aspect
      - 여러 객체에 공통으로 적용되는 공통 관심 사항을 의미.
      - 트랜잭션이나 보안 등이 해당.

  □ 세 가지 Weaving 방식

    ■ Advice를 Weaving하는 방식
      - 컴파일 시에 Weaving 하기.
      - 클래스 로딩 시에 Weaving 하기.
      - 런타임 시에 Weaving 하기.
    ■ 컴파일 방식
      - AspectJ에서 사용하는 방식.
      - 핵심 로직을 구현한 자바 소스 코드를 컴파일할 때에 알맞은 위치에 공통 코드를 삽입. (AOP가 적용된 클래스 파일이 생성.)
      - 컴파일 방식을 제공하는 AOP 도구는 공통 코드를 알맞은 위치에 삽입할 수 있도록 도와주는 컴파일러나 IDE를 함께 제공.
    ■ 클래스 로딩 방식
      - AOP 라이브러리는 JVM이 클래스를 로딩할 때 클래스 정보를 변경할 수 있는 에이전트를 제공.
      - 에이전트는 로딩한 클래스의 바이너리 정보를 변경하여 알맞은 위치에 공통 코드를 삽입한 새로운 클래스 바이너리 코드를 사용.
      - 원본 클래스 파일은 변경하지 않고 클래스를 로딩할 때에 JVM이 변경된 바이트 코드를 사용하도록 함으로써 AOP를 적용.
      - AspectJ 5 버전이 컴파일 방식과 더불어 클래스 로딩 방식을 함께 지원.
    ■ 런타임 방식
      - 소스 코드나 클래스 정보 자체를 변경하지 않음.
      - 프록시를 이용하여 AOP를 적용.
      - 핵심 로직을 구현한 객체에 직접 접근하는 것이 아니라 중간에 프록시를 생성하여 프록시를 통해서 핵심 로직을 구현한 객체에
        접근.
      ○ 프록시 기반의 AOP 적용 과정
        - 프록시는 핵심 로직을 실행하기 전 또는 후에 공통 기능을 적용하는 방식으로 AOP를 적용.
        - 메서드가 호출될 때에만 Advice를 적용할 수 있기 때문에 필드 값 변경과 같은 Joinpoint에 대해서는 적용할 수 없는 한계가 있음.

+ Recent posts