
Aspect Oriented Programming(관점 지향 프로그래밍)
OOP(Object Oriented Programming)으로 처리하기에는 다소 까다로운 부분을 AOP를 도입하여 쉽게 해결할 수 있기 때문에 등장한 개념입니다. 한 마디로 표현하자면 "공통적인 부분을 스프링이 도와주어 처리하게 된다"로 정리할 수 있는데, 자세하게 알아보도록 하겠습니다.
기존 OOP는 목적에 따라 클래스와 객체를 만들었기 때문에 비즈니스 로직, 부가 기능을 객체 단위로 분리하는데 그쳤습니다. 이때 어플리케이션의 전체를 관통하는 횡단 관심사가 존재하게 되는데, 횡단 관심사를 비즈니스의 핵심 로직과 분리하여 관리함으로써 OOP를 보완하게 됩니다.
횡단 관심사 예시
Spring AOP는 런타임 시점에 적용하는 방식을 사용합니다.

Aspect
여러 클래스나 기능에 걸쳐서 있는 관심사, 그리고 그것들을 모듈화한 것
AOP 중에서 가장 많이 활용되는 부분은 @Transactional(트랜잭션 관리) 기능
(AOP를 넣어주어야 하는 특정 주제 정도로 이해)
Advice
AOP에서 실제로 적용하는 기능(로깅, 트랜잭션, 인증 등)을 뜻함
(AOP가 동작하면서 실제로 동작하게 되는 기능을 뜻함)
Join Point
모듈화된 특정 기능이 실행될 수 있는 연결 포인트
(프로그램이 흘러갈 때, Aspect를 넣어줄 수 있는 포인트들을 의미)
Pointcut
Join point 중에서 해당 Aspect를 적용할 대상을 뽑을 조건식
Target Object
Advice가 적용될 대상 오브젝트
AOP Proxy
대상 오브젝트에 Aspect를 적용하는 경우 Advice를 덧붙이기 위해 하는 작업을 AOP Proxy라고 함.
주로 Code Generation Library 프록시를 사용하여 프록싱 처리를 한다.
(특정 클래스에 AOP를 입혀줄 때 클래스(Target Object)에 Proxy를 씌워주게 됨)
Weaving
Advice를 비즈니스 로직 코드에 삽입하는 것을 말함
AOP를 제대로 사용하기 위해 AspectJ 라이브러리를 사용하면 좋은데, 위 라이브러리는 사용하게 된다면 포스팅으로 다루어 보도록 하겠습니다.
기본적으로 제공되는 Spring AOP로는 다양한 기법(Pointcut 등)의 AOP를 사용할 수 없습니다.
(https://velog.io/@kai6666/Spring-Spring-AOP-%EA%B0%9C%EB%85%90 참고하여 작성)