JAVA/SPRING

[SPRING] AOP? 핵심기능과 부가기능의 분리.

gracelove91 2019. 8. 4. 19:39

개요

은행을 생각해보자.

계좌이체, 대출승인 같은 핵심 기능들이 있을 것이다.

이 핵심기능 안에는 각각 로깅이나 트랜잭션 처리와 같은 부가기능이 존재할 것이다.

각각의 핵심기능을 바라볼 때는 로깅이나 트랜잭션 또한 중복되지 않고 핵심기능 안에 속해있지만,

이걸 횡단으로 바라보면 로깅이나 트랜잭션은 중복된 코드다.

그래서 AOP(Aspect-Oriented Programming == 관점지향프로그래밍) 라 부른다.

AOP는 이런 부가기능의 중복을 제거하기 위해 존재한다.

용어정리

  • 타깃 : 부가기능을 부여할 대상. 핵심기능을 담은 클래스일 수도 있지만, 다른 부가기능을 제공하는 프록시 오브젝트일 수도 있다.

 

  • 어드바이스 : 타깃에게 제공할 부가기능을 담은 모듈. 메소드 전반에 걸쳐 참여할 수도 있지만(MethodInterceptor) 예외발생시에만 동작하는 어드바이스처럼 메소드 호출 과정의 일부에서만 동작하는 어드바이스도 있다.

 

  • 조인포인트 : 어드바이스가 적용될 수 있는 위치. 스프링의 프록시 AOP에서 조인포인트는 메소드의 실행단계뿐이다. 타깃오브젝트가 구현한 인터페이스의 모든 메소드는 조인포인트가 된다.

 

  • 포인트컷 : 어드바이스를 적용할 조인 포인트를 선별하는 작업 또는 그 기능을 정의한 모듈. 스프링 AOP의 조인포인트는 메소드의 실행이므로, 스프링의 포인트컷은 메소드를 선정하는 기능을 갖고있다. 그래서 포인트컷 표현식은 메소드의 실행이라는 의미를 지닌 excution으로 시작하고 메소드의 시그니처를 비교하는 방법을 주로 이용한다. 메소드는 클래스 안에 존재하기 떄문에 먼저 클래스를 선정하고, 그 안에 메소드를 선정하는 과정을 거치게된다.

 

  • 프록시 : 클라이언트와 타깃 사이에 투명하게 존재하며 부가기능을 제공하는 오브젝트다. DI를 통해 타깃 대신 클라이언트에 주입되며, 클라이언트의 메소드 호출을 대신 받아 타깃에 위임해주며 그 과정에서 부가기능을 부여한다. 스프링은 프록시를 이용해 AOP를 지원한다.

 

  • 어드바이저 : 포인트컷과 어드바이스를 하나씩 갖고있는 오브젝트. 어떤 부가기능(어드바이스)을 어디에(포인트컷) 전달할 것인가를 알고 있는 AOP의 가장 기본이 되는 모듈.

 

  • 에스펙트 : OOP의 기본모듈에 클래스가 있는 것처럼, AOP의 기본 모듈이다. 한 개 또는 그 이상의 포인트컷과 어드바이스의 조합으로 만들어진다. 싱글톤이다.

 

  • 위빙 : 포인트컷에 의해 결정된 타겟의 조인포인트에 삽입하는 과정. 타겟의 코드에 영향을 주지않으면서 필요한 어드바이스를 적용할 수 있다