오늘은 DI에 이어 또 어려운 AOP에 대해 정리했다.
AOP는 관점 지향 프로그래밍 이라는 뜻으로 어떤 로직을 핵심적인 기능(Core Concerns)과 부가적인 기능(Cross-cutting Concerns)으로 분리하고 각각 모듈화 하는 것이다.
개념은 이런데 너무 어려워서 지금부터 하나하나 공부해보기로 합시당ㅠㅠ
ex) 핵심 기능 : 우리가 적용하고자하는 비즈니스 로직,
부가 기능 : 핵심 로직을 실행하기 위해 행해지는 DB연결, 로드, 입/출력 등
AOP가 나오면 OOP 이야기도 함께 나오는데 AOP는 OOP를 더욱 OOP스럽게 사용할 수 있도록 도와주고 OOP의 한계를 극복하기 위한 패러다임이라 한다.
OOP는 객체를 재사용함으로 코드의 중복을 줄일 수 있지만, 그럼에도 반복되는 코드를 없앨수는 없었다.
하지만 AOP는 이러한 부분을 해결해준다.
OOP로직에서 각 객체별로 처리했던 것들을 관점별로 모듈화하여 외부에서 접근하게 필요할 때 불러와 연결하게해서 유지 보수나 재 사용에 용이하도록 한다.
각 관점별로 로직을 모듈화한다는 말이 좀 어렵지만 이는 코드들을 부분적으로 나눠서 모듈화 하겠다는 의미와 같다.
소스 코드 상에서 다른 부분에 계ㅔㅔ속 반복해서 쓰는 코드들이 있는데 이 것을 흩어진 관심사라고한다.
aspect
는 부가기능을 정의한 코드 어드바이스(Advice)와 이를 어디에 적용하지를 결정하는 포인트컷(PointCut)을 합친 개념으로흩어진 부가 기능들을 독립된 클래스로 만든 것을
aspect
라고 한다.
Aspect
위에 설명한 대로 흩어진 관심사를 모듈화 한 것 (주로 부가기능 모듈화)
Target
핵심 기능을 담고 있는 모듈로 Aspect를 적용하는 곳(class, method...)
Advice
Target에 제공할 부가 기능에 대한 실질적인 구현체(모듈)
JointPoint
Advice가 적용될 위치로 Target이 구현한 인터페이스의 모든 메서드는 조인 포인트가 된다.
Point Cut
JointPoint의 상세 스펙 정의, "A 메소드 진입 시점에 호출해라"처럼 더 구체적으로 Advice가 실행될 지점 정할 수 있다.
스프링은 타겟(Target)객체에 대한 프록시를 만들어 제공한다.
(프록시를 쓰는 이유는 접근제어 및 부가기능을 추가하기 위해)
타겟을 감싸는 프록시는 실행시간(Runtime)에 생성돈다.
AOP구현에는 두가지 방법이 있는데
참조
https://goodgid.github.io/Spring-Framework-AOP-Concept/
https://shlee0882.tistory.com/206
https://yeoncoding.tistory.com/175
https://devlog-wjdrbs96.tistory.com/398
https://engkimbs.tistory.com/746