이전

스프링 AOP

부가 기능 적용 문제

  1. 부가 기능을 적용할 때 아주 많은 반복이 필요하다.
  2. 부가 기능이 여러 곳에 퍼져서 중복 코드를 만들어낸다.
  3. 부가 기능을 변경할 때 중복 때문에 많은 수정이 필요하다.
  4. 부가 기능의 적용 대상을 변경할 때 수많은 수정이 필요하다.

소프트웨어 개발에서 변경 지점은 하나가 될 수 있도록 잘 모듈화 되어야 한다. 그런데 부가 기능처럼 특정 로직을 애플리케이션 전반에 적용하는 문제는 일반적인 OOP 방식으로는 해결이 어렵다.

AOP 의 적용 방식은 크게 3가지 방법이 있다.

  1. 컴파일 시점
    • .java 파일을 컴파일러를 통해 .class를 만드는 시점에 부가기능 로직을 추가하는 방식
    • 모든 지점에 적용가능 (클래스, 변수, 메소드)
    • AspectJ 가 제공하는 특별한 컴파일러를 사용해야 하기 때문에 특별한 컴파일러가 필요함
  2. 클래스 로딩 시점
    • .class 파일을 JVM 내부의 클래스 로더에 보관하기 전에 조작하여 부가기능 로직을 추가하는 방식
    • 모든 지점에 적용가능 (클래스, 변수, 메소드)
    • 특별한 옵션과 클래스 로더 조작기를 지정해줘야함
  3. 런타임 시점
    • 스프링이 사용하는 방식
    • 컴파일이 끝나고 클래스 로더에 이미 다 올라가 자바가 실행된 다음에 동작하는 방식
    • 실제 대상 코드는 그대로 유지되고 프록시를 통해 부가 기능을 적용
    • 프록시는 메서드 오버라이딩 개념으로 동작함 (메소드 한정 적용 가능)
    • 스프링 컨테이너가 관리하는 bean에만 적용 가능

스프링 AOP 는 AspectJ 문법을 차용하고 proxy 방식의 aop 제공함