<aside>
💡 모듈화 : 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것
</aside>
프록시 관련 더 공부하고 볼 링크
[<https://velog.io/@backtony/Spring-AOP-총정리#7-실무-주의사항>](<https://velog.io/@backtony/Spring-AOP-%EC%B4%9D%EC%A0%95%EB%A6%AC#7-%EC%8B%A4%EB%AC%B4-%EC%A3%BC%EC%9D%98%EC%82%AC%ED%95%AD>)
관점(관심) 지향 프로그래밍
어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점을 기준으로 모듈화 하겠다는것
AOP는 **흩어진 관심사(Crosscutting Concerns)**를 모듈화 할 수 있는 프로그래밍 기법

- 클래스 A, B, C에서 공통적으로 나타나는 색깔 블록은 중복되는 메서드, 필드, 코드 등이다
- 이 때 한 클래스의 주황색 메서드를 바꿔야 한다고 하면 다른 클래스들의 주황색 메서드들을 고쳐주어야 한다.
- 이는 SOLID원칙을 위배하며 유지보수를 어렵게 만든다. 이런 식으로 소스 코드상에서 계속 반복해서 사용되는 부분들을 **흩어진 관심사(Crosscutting Concerns)**라고 한다
- 처음에 말한 관점에 따라 로직을 모듈화 한다는 것이 흩어진 관심사를 모듈화 하겠다는 의미이다.
- 즉 각 색깔의 블럭들을 모듈화 시키고 정의한 블럭을 Aspect라고 한다
- OOP : 비즈니스 로직의 모듈화
- AOP : 인프라 혹은 부가기능의 모듈화
- 대표적인 예 : 모니터링 및 로깅, 동기화, 오류 검사 및 처리, 성능 최적화(캐싱) 등
- 각각의 모듈들의 주 목적 외에 필요한 부가적인 기능들
AOP 적용 방법
- 컴파일 타임 적용
-
컴파일 시점에 바이트 코드를 조작하여 AOP가 적용된 바이트 코드를 생성하는 방법.
- 로드 타임 적용
-
순수하게 컴파일한 뒤, 클래스를 로딩하는 시점에 클래스 정보를 변경하는 방법