본문 바로가기
Spring

Spring AOP

by Heesu.lee 2020. 10. 19.

AOP란

Aspect-Oriented Programming 의 약자이다.

서로 다른 곳에서 사용되고 있는 Aspect(관점) 들을 모아 모듈화 하는 기법이다.

즉, 다시 말해 Aspect 은 여러 곳에서 공통으로 적용되는 기능을 의미한다. (e.g. 로깅, 트랜잭션, 접근 제어 등의 보안)

 

용어 정리

Target Object

부가 기능을 부여할 대상

  • Spring 에서는 대게 Service 계층이 해당

Advice

부가 기능을 정의한 구현체 Aspect어느 시점에 적용이 될 지를 결정

아래의 여러 어노테이션을 통해 적용 시점을 변경시킬 수 있다.

  • @Before
    • 메소드 실행 전 기능 수행
  • @After
    • 메소드 결과와 상관없이 메소드가 완료 된 이후에 기능 수행
  • @AfterReturning
    • 메소드가 성공적으로 완료 된 이후에 기능 수행
  • @AfterThrowing
    • 메소드 수행 중 예외 발생 시 이후에 기능 수행
  • @Around
    • 메소드가 실행되기 전과 후 기능 수행
      • proceed() 메소드 호출 전, 후를 통해 구분할 수 있다.

Joinpoint

Advice를 적용 가능한 지점을 의미 (메소드 호출, 필드값 변경 등이 이에 해당)

Spring AOP 의 경우 프록시 기반이기에 메소드 실행에 대한 JointPoint만 지원한다. 이 외 (필드값 변경 등)에 적용하고 싶다면 AspectJ를 사용해야 한다

Pointcut

Aspect(부가 기능)가 적용될 대상을 선정하는 방법을 정의한 모듈

Spring은 기본적으로 AspectJ 포인트컷 표현식 언어를 사용
Aspect 는 Pointcut 표현식에 맞고, JoinPoint에 해당하는 지점에서 실행된다

Weaving

Advice를 핵심 로직 코드에 적용하는것을 의미하며 3가지 방식이 존재한다.

  • 컴파일 타임 (Compile-time Weaving)
    • AspectJ 사용
    • 자바 파일을 클래스 파일로 만들 때, 바이트 코드를 조작하여, 조작된 바이트 코드를 생성
    • 즉, Aspect(부가 기능)가 해당 class 파일에 포함되어 있어야 한다.
  • 로드 타임 (Class Load-time Weaving)
    • AspectJ 사용
    • 순수하게 자바 파일은 클래스 파일로 컴파일 되며, 해당 클래스 파일을 로딩하는 시점에 해당 로직을 끼워넣는 방식
    • 즉, 클래스 파일 자체의 바이트 코드는 변함이 없으며, JVM에 로딩한 메모리엔 Aspect가 포함되어 있는 것
  • 런타임 (Run-time Weaving)
    • Spring AOP 가 사용하는 방식
    • 소스코드나 클래스 정보 자체를 변경하지 않고 중간에 프록시 객체를 생성하여 Aspect 를 적용한다.

 

참조

댓글