출처: https://sjh836.tistory.com/157 [빨간색코딩:티스토리]
IoC가 낮은 결합도와 관련된 것이라면 AOP 는 높은 응집도
와 관련되어 있다.
서비스들의 비즈니스 메소드들은 복잡한 코드로 구성되어있는데, 그 중 핵심 로직
은 얼마안되고 대부분은 트랜잭션, 로깅 처리, 인증과 관련된 코드들이 있을 수 있다
.
이럴 때 비핵심이지만 꼭 필요하고, 공통화할 수 있는 부분을 따로 빼서(횡단 분리) 관리하는 것
클라이언트가 호출하는 모든 비즈니스 메소드
, 조인포인트 중에서 포인트컷되기 때문에 포인트컷의 후보로 생각할 수 있다.
특정 조건에 의해 필터링된 조인포인트
, 수많은 조인포인트 중에 특정 메소드에서만 횡단 공통기능을 수행
시키기 위해서 사용
표현식 : 리턴타입 패키지경로 클래스명 메소드명(매개변수)
횡단 관심에 해당하는 공통 기능의 코드
, 독립된 클래스의 메소드로 작성
포인트컷으로 지정한 핵심 관심 메소드
가 호출될 때, 어드바이스에 해당하는 횡단 관심 메소드가 삽입되는 과정을 의미
한다
이를 통해 비즈니스 메소드를 수정하지 않고도 횡단 관심에 해당하는 기능을 추가하거나 변경이 가능해진다.
포인트컷과 어드바이스의 결합
이다.
-> 어떤 포인트컷 메소드에 대해 어떤 어드바이스 메소드를 실행할지 결정
포인트컷을 이용하면 어드바이스 메소드가 적용될 비즈니스 메소드를 정확하게 필터링
execution
: 가장 정교한 포인트컷을 만들수 있다. 리턴타입
+ 패키지경로
클래스명
메소드명(매개변수)
within
: 타입패턴 내에 해당하는 모든 것들을 포인트컷
bean
: bean이름으로 포인트컷
어드바이스 메소드를 의미있게 구현하려면 클라이언트가 호출한 비즈니스 메소드의 정보가 필요하다.
-> 예를들면 예외가 터졌는데, 예외발생한 메소드의 이름이 뭔지 등을 기록할 필요가 있을 수 있다. 이럴때 JoinPoint 인터페이스가 제공하는 유용한 API들이 있다.
JoinPoint
를 어드바이스 메소드 매개변수로 선언해야한다.
-> 이때 인자는 스프링 컨테이너가 넘겨준다.
ex. 메소드명(JoinPoint jp)
이때 Around 어드바이스만 다른 어드바이스와 약간 다른데, ProceedingJoinPoint
객체를 인자로 선언해야한다.(proceed() 등이 추가로 구현되어있음)
ProceedingJoinPoint 는 JoinPoint를 상속받는다.