AOP (Aspect Oriented Programming)
관점 지향 프로그래밍
흩어진 코드
1 |
|
흩어져 있는 코드들은 AAAA 혹은 BBBB를 수정하려면
AAAA와 BBBB가 있는 모든 클래스의 메서드를 찾아가서 변경해야 합니다.
모아 놓은 코드
1 |
|
하지만 코드를 모아서 메소드로 정의를 하면
원래의 메소드에는 기존에 가지고 있던 기능을 가지고
부가적으로 공통적으로 하던 기능인 AAAA와 BBBB를 모아서
별도의 클래스에서 가지고 있는 것을 AOP라고 할 수 있습니다.
다양한 AOP 구현 방법
컴파일
A.java —(AOP)—> A.class
AspectJ 가 제공하는 기능
바이트코드 조작
A.java –> A.class —(AOP)—> Memory
AspectJ 가 제공하는 기능
프록시 패턴
Spring AOP가 사용하는 방법이며,
Design Pattern을 이용하여 AOP를 구현하는 방법입니다.
예제 - 기존 코드 건드리지 않고 새 기능 추가하기
1 |
|
예제 - Custom Annotation 을 사용한 Stopwatch 사용
@LogExcuetionTime이라는 태그를 만들어서
예제 코드의 OwnerController 여러 메서드에 작성
Annotation은 주석같은 코멘트이므로 기능이 동작하지는 않습니다
이 어노테이션을 읽어서 실행하는 Aspect를 생성해야 합니다.
1 |
|
실제 기능이 동작할 Aspect 생성
1 |
|
이러한 코드가 Aspect 이며, Spring이 제공해주는 Annotation 기반의 AOP입니다.
안의 내부는 Proxy Pattern 기반으로 동작합니다.
이렇게 작성한 상태에서 Application을 실행해서 해당 메소드를 동작시켜보면
1 |
|
이렇게 위의 작성한 stopWatch를 볼 수 있습니다.
위 두가지 예제에 대한 해설
OwnerController와 Cash라는 클래스는 Aspect를 적용할 Target이며,
CashPerf와 LogAspect는 같은 역할을 합니다.
다만 Annotation을 사용하면 Bean으로 등록할 때 무언가를 상속받고
Cash 대신에 CashPerf를 주입받는 일들이 자동으로 이루어집니다.
Spring AOP를 적용하는 방법은 여러가지가 있고,
Annotation 없이도 적용을 하는 방법이 있습니다.
Annotation을 작성하여 적용하는 방법이 좀 더 명시적입니다.
해당 포스트는 백기선 님의 강의 를 바탕으로 작성되었습니다.