Spring #15 - Spring AOP

업데이트:

Spring AOP

스프링 AOP : 개념소개

한줄 요약

  • AOP란 흩어져있는 여러 관심사(기능)를 Aspect로 모듈화하여 하나로 모으는 기법이다. 주요 개념으로는 Aspect, Advice, Target, Pointcut, Join point가 있으며, 구현체로는 자바에서는 AspectJSpring AOP가 있다. 적용 방법으로는 AspectJ를 이용하여 컴파일, 로드타임에서 적용할 수 있고, Spring AOP를 이용하여 런타임 시점에서 적용 할 수 있다.

AOP (Aspect-Oriented Programming)

  • OOP를 보완하는 수단으로 흩어진 Aspect를 모듈화하여 더욱 OOP답게 만드는 프로그래밍 기법이다.

  • Concern : 여러 클래스 또는 메서드에 걸쳐 나타나는 비슷한 코드, 필드, 메서드, 기능 등을 말한다.

    • Transaction, logging - 해당 메서드 실행 시간 확인 등
  • 흩어져있는 공통적으로 필요한 기능을 Aspect로 만들어 재사용 가능하게 모듈화하여 만들어 사용한다. Aspect 내에서 그 기능을(Advice) 어느곳에(target) 적용해야하는지 알려준다.

    AOP

AOP 주요 개념

  • Aspect : 흩어진 관심사(Crosscutting Concerns, 기능들)를 하나로 묶어 관리하기 위하여 모듈화 한 것이다.
  • Advice : Aspect 모듈화 내부에 있는 해야할 일들(기능들)을 말한다.
  • Target : 어떤 클래스에 적용을 할 것인지, 적용이 되는 대상을 말한다.
  • Pointcut : target에서 어디, 어느 시점에 적용해야 하는지를 말한다.
    • A라는 클래스에 B라는 메서드를 호출할때 이 기능을 적용해라 하는게 포인트 컷이다.
  • Join point : 조인 포인트를 여러 합류 지점이다. 스펙 또는 개념적인 것에 가깝다.
    • 메서드 실행 시점이라던가 메서드 실행할 때 이 어드바이스를 끼워 넣어어라 할 때 그 끼어드는 지점들을 말한다. 생성자를 호출했을때 필드 접근하기 전 등등 여러 합류점이 있다.

AOP 구현체

  • 자바
    • AspectJ : 다양한 Join point와 기능을 제공한다.
    • Spring AOP : AspectJ에 비해 국한적으로 기능을 제공해준다.

AOP 적용방법

  • 컴파일
    • AspectJ
    • 컴파일 과정에서 자바 파일을 클래스 파일로 만들 때 Aspect를 추가하여 바이트 코드를 만든다.
    • 애초에 컴파일 시 적용하므로 로드 타임과 런타임에 아무런 성능적인 부하가 없지만, 별도의 컴파일을 한번 더 해야하는 단점이 있다.
  • 로드 타임
    • AspectJ
    • 컴파일은 일반적으로 실행되며, Target 클래스 파일을 로딩하는 시점에 Aspect를 끼워서 넣는다. (load time weaving)
    • AspectJ의 다양한 문법을 사용할 수 있는 장점이 있지만, 클래스를 로딩하는 시점에 약간의 부하가 생길 수 있고 로드 타임 위버를 설정 해줘야 한다는 단점이 있다.
  • 런타임
    • Spring AOP
    • A라는 클래스 타입의 빈을 만들 때, A라는 빈을 감싸고 있는 A타입의 프록시 빈을 만든다. A의 기능을 호출하기 전에 Aspect가 가진 기능을 호출하고 나서 A의 기능을 호출한다.
    • 빈을 만드는 과정에서 약간의 비용이 들지만, 문법이 쉽고 아무런 설정을 안해도 된다.

댓글남기기