어플리케이션 로직은 크게 핵심 기능과 부가 기능으로 나눌 수 있다.
핵심 기능은 해당 객체가 제공하는 고유의 기능이며
부가 기능은 핵심 기능을 보조하기 위해 제공되는 기능이다.
보통 부가 기능은 여러 클래스에 걸쳐서 함께 사용되는데, 이런 부가 기능을 여러 곳에 적용하려면 너무 번거롭다. 프록시가 없다고 가정하면 100개의 클래스에 100개를 적용하고 부가 기능을 수정하고자 하면 100개의 클래스를 수정해야한다.
부가 기능(횡단 관심사)과 부가 기능을 어디에 적용할지 선택하는 기능을 합해서 하나의 모듈로 만들었는데 이것이 바로 에스팩트(aspect)이다. 그리고 이 에스팩트를 사용한 프로그래밍 방식을 관점 지향 프로그래밍 AOP이라 한다. AOP는 OOP를 대체하기 위한 목적이 아닌 OOP의 부족한 부분을 보조하는 목적으로 개발되었다.
AOP의 대표적인 구현으로 AspectJ 프레임워크가 있다.
AspectJ 프레임워크는 스스로를 다음과 같이 설명한다.
스프링은 이 AspectJ의 문법을 차용하고 AspectJ가 제공하는 기능의 일부를 제공한다.
스프링이 AspectJ를 직접 사용하는 것은 아니다.
크게 3가지 방식으로 나뉜다.
적용 가능 지점(조인 포인트) : 생성자, 필드 값 접근, static 메서드 접근, 메서드 실행
프록시 방식을 사용하는 스프링 AOP는 메서드 오버라이딩 개념으로 동작해 메서드 실행 지점에만 AOP를 적용할 수 있다. 또한, 빈으로 등록할 수 있는 스프링 빈에만 AOP를 적용할 수 있다.
위의 제약사항에도 불구하고 프록시를 사용하는 스프링 AOP를 사용하는 이유는 AspectJ를 사용하려면 복잡한 설정과 높은 러닝커브가 동반되어 운영이 힘든점이 있기 때문이다.
또한, 스프링이 제공하는 AOP 기능만 사용해도 대부분의 문제가 해결된다.