Aop는 Aspect-Oriented Programming의 약어로 관점 지향 프로그래밍을 의미한다. OOP를 보완하는 수단으로 흩어진 Aspect를 모듈화 할 수 있는 프로그래밍 기법이다.
만약 AOP를 처음 보는 사람이 AOP에 대해 물어본다면, 나는 그냥 쉽게 “프로그램 구조를 바라보는 관점(Aspect)을 바꿔주는 기법이야!” 라고 말해주고 싶다. 기존의 OOP 즉, 객체 지향 프로그래밍은 설계를 할때, 각각의 역활에 따라 클래스를 분리하였다.
음.. 비유를 들자면, 대학교의 각 학과를 클래스라 생각하면, 컴퓨터 공학과, 전자공학과,법학과 등등 다양한 클래스들이 존재하는다. 이것을 OOP가 추구하는 방향이라면, AOP는 각 학과에는 공통적으로 회장, 부회장 등을 하는 사람이 공통적으로 존재합니다. 어느 학과에 있던 회장과 부회장의 역활은 똑같다는 거다. 이것이 AOP가 학교를 바라보는 관점이라고 생각하면 된다. 즉, AOP는 공통된 요소를 추출하는 것이라고도 할 수 있다. 이해를 돕기 위해 아래 그림을 내가 그려보았다.
이제 프로그래밍 세상에서 OOP와 AOP를 구분지어 밑에 정리해보면.
OOP : 비지니스 로직의 모듈화
AOP : 인프라 혹은 부가기능의 모듈화
프로그래밍을 하다보면 공통적인 기능이 많이 발생한다. 이러한 공통 기능을 모든 모듈에 적용하기 위해 OOP에서는 상속을 이용한다. 하지만 Java에서는 다중 상속이 불가능하며, 상속을 받아 공통 기능을 부여하기에는 한계가 있다. 이를 해결하기 위해 AOP가 등장하게 된 것이다.
Spring의 핵심 개념중 하나인 DI가 애플리케이션 모듈들 간의 결합도를 낮춰준다면, AOP는 애플리케이션 전체에 걸쳐 사용되는 기능을 재사용하도록 지원하는 것이다. 하지만, 공통적인 기능을 재사용 한다는 것이 AOP의 기능이어서 만약 공통적인 기능 중 하나가 잘못되면 전체에 다 영향을 미친다는 단점이 존재한다.