1. 개요
Spring의 큰 특징 중에 핵심 개념을 꼽는다면 IoC, DI, AOP 가 될 것 같네요.
IoC는 Inversion of Controller(제어 역전), DI는 Dependency Injection(의존관계 주입),
AOP는 Aspect Orient Programming(관점 지향 프로그래밍) 의 약자입니다. 
이번엔 그 중 하나인 AOP(Aspect-Oriented Programming)에 대해서 알아보도록 하죠~
 
 AOP가 뭔지 간단하게 알아봐볼께요~ :)
 
 
2. AOP(Aspect-Oriented Programming)
AOP는 애플리케이션 전체에 걸쳐 사용되는 기능을 재사용하도록 지원하는 것이라고 합니다.
 
구글에서 검색해봅니다.
 
"컴퓨팅에서 관점 지향 프로그래밍(aspect-oriented programming, AOP)은 횡단 관심사(cross-cutting concern)의 분리를 허용함으로써 모듈성을 증가시키는 것이 목적인 프로그래밍 패러다임이다. 코드 그 자체를 수정하지 않는 대신 기존의 코드에 추가 동작(어드바이스)을 추가함으로써 수행하며, "함수의 이름이 'set'으로 시작하면 모든 함수 호출을 기록한다"와 같이 어느 코드가 포인트컷(pointcut) 사양을 통해 수정되는지를 따로 지정한다. 이를 통해 기능의 코드 핵심부를 어수선하게 채우지 않고도 비즈니스 로직에 핵심적이지 않은 동작들을 프로그램에 추가할 수 있게 한다. 관점 지향 프로그래밍은 관점 지향 소프트웨어 개발의 토대를 형성한다."
 
  라고 위키피디아에서 얘기해주네요. 
 
기존에 OOP(비즈니스 로직의 모듈화)에서 바라보던 관점을 다르게 해서 부가기능적인 측면에서 보았을 때 공통된 요소를 추출하자는 것인데,
이때 가로 횡단 영역의 공통된 부분을 잘라냈다고 하여, AOP를 크로스 컷팅(Cross-Cutting)이라고 불리기도 합니다.
 
AOP는 OOP를 대신하는 새로운 개념이 아니라, OOP를 더욱 OOP답게 사용할 수 있도록 도와주는 개념이라고 합니다.
객체를 재사용함으로써 개발자들은 반복되는 코드의 양을 굉장히 많이 줄일수가 있었구요.
하지만 객체의 재사용에도 불구하고 반복되는 코드를 없앨수는 없었는데,
예를 들어 로그, 권한 체크, 인증, 예외 처리 등 필수적으로 해야하기 때문에 소스에서 반복될 수 밖에 없는 부분도 있습니다.
AOP는 이러한 부분을 해결해주는 거죠.
 
 
오늘은 여기까지...