Aop 없는상황
-> 여러 서비스 메서드에 로깅 추가

log = 하나의 공통된 관심사 = Aspect
Aop = 횡단관점

공통되는 부분을 따로 뺴내어 작성하는 메서드를 Advice 라고 이야기 하며
Advice를 적용될 수 있는 모든 관점을 JoinPoint
JoinPoint 중 실체 Advice를 적용할 부분을 PointCut
끼워넣는 작업을 Weaving 이라고함
build.gradle 에 dependence 를 추가해야됨
Maven 에 Spring Aop 검색후


복사 후 build gradle 에 붙혀넣기
refresh
이건 내가 현재 깔려있는 spring 버전하고 비슷한 버전을 다운받는게 좋다

단순히 bean 으로 관리하라고 @Component 선언

@Aspect 선언

메서드 만들고 이 메서드의 log를 모든곳에 찍겟다
@Before 으로 어노테이션 만들어주고
advice를 적용할 부분을 적용해야된다
before 괄호안에다가 포인트컷 작성
execution : 메서드 실행 지점을 가리키는 키워드
edu.kh.project 를 쓴이유는 이 프로젝트를 처음만들때 이름을 이거로 했으니 이게 최상위 폴더라 생각하고
이 하위에 있는 이라는 뜻
뒤에 .. 은 0개이상이라는 뜻
Controller 는 어노테이션으로 @Controller 가 붙어있는 얘들전부라는 뜻
.* 은 모든 메서드를 가르킨다
뒤에 괄호(..) 은 0개이상의 메서드의 파라미터가 있던없던 상관안한다
execution : 메서드 실행 지점을 가리키는 키워드
** : 모든 리턴 타입을 나타냄
edu.kh.project : 패키지명을 나타냄 . edu.kh.project 패키지와 하위 패키지에 속하는 것을 대상을함
.. : 0개 이상의 하위 패키지를 나타냄
Controller : 이름에 "Controller"라는 문자열을 포함하는 모든 클래스를 대상으로 함
.* : 모든 메서드를 나타냄
(..) : 0개 이상의 파라미터를 나타냄
서버를 키고 Controller 가 동작될만한 행동을 하면 testAdvice 가 찍힌다.

매개변수로 JoinPoint jp 를 가져다가 쓸수 있다
Aop 기능이 적용된 대상이라고 생각하면 된다

이렇게 하면 클래스이름만 가져다쓸수있음

pointCut 을 보아두는 클래스이다 이렇게쓰는 이유는
간단하게 쓰기 위해서

이렇게 길게 쓰는 이뉴는 @Controller 단이 아니므로 이렇게 얻어와야됨

Arround 는
전/후로 나뉘어서 각각 계산하는 aspect 라고 보면된다
무조건 리턴타입은 Object 여야되고 joinpoint 처럼 pjp.get으로 갖고올수있따
throws Throwable 얘는
예외처리 클래스 Exception 이 최상위 지만 얘보다 더 위에있는 부모이다

service에서 클래스 위에 어노테이션으로
@Transctional 이 붙어있을때만 작동함

jp 에는 어디 메서드에서 발생햇는지 알려고하는거고
error 는 원인의 메시지를 띄워줄라고 하는 것이다.