AOP란?

AOP는 Aspect-Oriented-Programming의 약자로 관점지향 프로그래밍을 의미합니다. 어떤 로직을 관점으로 핵심적인 관점과 부가적인 관점으로 나누고 관점을 기준으로 모듈화 하는 것을 의미합니다. 

로직상에서 다른 부분에 반복적으로 사용하는 부분을 흩어진 관심사라고 합니다. 

AOP는 흩어진 관심사를 모듈화 하여 핵심적인 비즈니스 로직에서 분리하여 재사용할 수 있게 해 줍니다.

 

AOP의 용어

  • 포인트 컷(Pointcut) : 조인 포인트 중에서 어드바이스가 적용될 경로, 주로 AspectJ 표현식을 사용하여 지정
  • 어드바이스(Advice) :  부가기능 로직(로그 추적 기능, 메서드 실행시간 기록)
  • 어드바이저(Advisor) : 하나의 포인트컷과 하나의 어드바이스로 구성
  • 에스펙트(Aspect) : 포인트컷 + 어드바이저를 모듈화
  • 조인 포인트(Join point) : 어드바이스가 적용될 수 있는 위치, 메서드 실행, 생성자 호출과 같은 프로그램 실행 중 지점, 스프링 AOP는 프록시 방식을 사용하므로 항상 메서드 실행 지점으로 제한
  • 위빙(Weaving) : 포인트컷으로 결정한 타겟의 조인 포인트에 어드바이스를 적용하는 것, 핵심기능 코드에 영향을 주지 않고 부가기능을 추가 가능

 

 

AOP가 동작하는 방식 

  • 컴파일 시점
  • 클래스 로딩 시점
  • 런타임 시점(프록시)

AOP가 동작하는 방식은 3가지가 있습니다. 스프링 AOP는 런타임 시점(프록시) 방식으로 동작하게 됩니다. 

(동작하는 방식에 대한 상세한 설명은 다른 포스팅에서 다루겠습니다.)

 

 

그럼 이제 프록시 패턴에 대해서 알아보겠습니다.

 

프록시 패턴이란?

프록시 패턴에서 프록시는 대리자를 의미합니다. 기존의 클라리언트가 서버로 바로 요청을 보내는 방식에 프록시 패턴을 도입하면 클라이언트는 서버에 바로 요청을 보내는게 아닌 대리자인 프록시에 요청을 하고 프록시가 서버에 요청을 하는방식이 프록시 패턴입니다.

 

우리는 보통 요청하는 자와 요청을 받는 자로 나눕니다. 요청하는 자는 클라이언트가 되고 요청을 받는 자는 서버가 됩니다.

 

 

기존 방식에서 프록시 패턴을 도입하게 된다면 아래와 같이 클라이언트가 서버가 아닌 프록시에게 요청을 합니다.

 

프록시는 대체 가능합니다. 즉 어떤 객체든 프록시가 될 수 있다는 것을 의미합니다.

어떤 객체가 프록시가 될 수 있으려면 요청하는 클라이언트는 프록시에게 요청을 하는지 서버에게 요청을 하는지 몰라야 합니다. 

 

 

프록시의 주요 기능

  • 접근제어
    • 지연로딩, 캐싱, 권한에 따른 차단
  • 부가 기능 추가
    • 서버가 제공하는 기능에 더해서 부가 기능을 수행 (ex :  메서드 실행시간 측정 후 로그 작성)

 

스프링 AOP에서 프록시 패턴을 사용하는 이유

  • 비즈니스 로직은 요청에 대한 처리만 하고  메서드의 실행 시간을 측정하는 부분 등 부가적인 기능은 프록시에서 구현을 하면 객체지향의 원칙인 SRP를 지킬 수 있습니다. 즉 횡단 관심사를 분리하면 SRP를 지킬 수 있습니다.
  • 각 비즈니스에 동일한 부가 기능을 구현한 코드를 제거할 수 있습니다.

 

 

OOP와 AOP 차이점

객체지향 프로그래밍 방식과 관점지향 프로그래밍 방식의 차이점은 논할 수 없습니다.

서로 상방 된 개념이 아니라 관점지향 프로그래밍이 코드 중복 제거, 횡단 관심사 분리를 하여 객체지향 프로그래밍을 더욱 객체지향 프로그래밍을 할 수 있도록 도움을 주기 때문입니다.

 

 

 

해당 포스팅에서 AOP가 동작하는 방식과 프록시 패턴의 방식인 JDK 프록시 방식, CGLIB프록시 방식에 대해서 다루지 않아 다음 포스팅에서 다루겠습니다.