관점 지향 프로그래밍 AOP (Aspect-Oriented Programming)
-
AOP?
- 핵심 로직과 부가기능을 분리, 부가기능(횡단 관심사)을 모듈화하여 재사용 할 수 있도록 하는 프로그래밍 패러다임
-
횡단 관심사?
- 여러 모듈이나 객체에서 공통적으로 발생하는 로깅, 보안, 트랜잭션 관리 등
-
목적?
- 횡단 관심사를 별도의 모듈로 분리하여 중복코드를 최소화, 유지보수성과 재사용성을 향상
(OOP의 한계를 보완)
-
주요 개념
-
①Aspect
- 횡단 관심사를 모듈화 한 단위 (e.g. Transaction)
-
②PointCut
- Aspect가 적용될 대상 (프로그램 상 실제 위치 e.g. 메서드, 클래스, 어노테이션..)
-
③JoinPoint
- Aspect가 적용될 프로그램의 실행 지점 (tx.begin() 과 tx.commit() 사이)
-
④Advice
- 횡단 관심사를 언제, 어떻게 처리할지 정의한 것 (joinPoint 앞, 뒤, 예외 발생 시 등 다양한 시점에 적용할 수 있다)

Java AOP Framwork (Spring AOP vs AspectJ)
-
Weaving?
- Aspect를 실제 프로그램 코드에 적용하는 과정
-
Weaving 방식
- Compile-time Weaving
- 컴파일 시점에 AOP 적용을 확인하고 새로운 클래스를 만들어 줌
- AspectJ
- Load-time Weaving
- JVM에서 Class를 로딩하는 시점에 바이트코드를 변경 (원본클래스 유지)
- AspectJ
- Run-time Weaving
- 객체에 직접 접근하지 않고 프록시를 통해 접근하여 AOP적용
- SpringAOP
-
성능
- AspectJ 가 SpringAOP에 비해 8~35배 빠름 (SpringAOP는 프록시를 거쳐야하기 떄문에 오버헤드가 있다)
- SpringAOP가 간단하게 적용할 수 있음 (AspectJ 는 별도의 컴파일러, weaver 필요)