1. AOP 구현 방식 이해하기

(1) 주 업무 로직이 담긴 exam
Exam exam = new NewlecExam(1,1,1,1);
(2) Proxy
AOP는 곁다리 업무를 원래의 주 업무 로직과 결합시키기 위해서는 Proxy라는 도구가 반드시 있어야함.
즉, Proxy는 곁다리 업무를 연결해 주는 도구
자바에서는 Proxy를 지원하고 있으며, Proxy의 newProxyInstance(loader, interface, h)를 이용해 설정해준다.
이때 loader는 실제 업무를 호출할 수 있어야 하기 때문에 객체의 정보를 전달해주는 역할을 하며,
interfaces는 인터페이스 정보인 Exam의 정보를 넘겨주는 역할을 하며, h는 곁다리 업무를 꽂을 수 있는 부분을 의미한다.
InvocationHandler()의 invoke()는 주 업무 로직을 실행시키는 메서드이며, 실제 업무 객체가 호출될때 호출하는 메서드가 갖고 있는 파라미터를 args로 옮겨주고 이걸 invoke로 전달하해줌으로써 인자가 빠지지 않도록 함.
이때 핸들러 안의 곁다리 업무는 결과값을 리턴해야하므로 모든 형태의 값을 반환할 수 있도록 Object로 선언.
위의 코드는 맨 위에서 주 업무 객체를 생성하고, 주 업무 외의 곁다리업무를 가진 proxy를 만들어서
주 업무객체의 시작과 끝에 곁다리 로직이 실행되도록 설정한 것.
2. 스프링으로 AOP 구현해보기
위에서 Proxy를 이용해서 구현했던 AOP방식을 Spring의 도움을 받으면 조금 더 쉽게 구현할 수 있다.
AOP로 구현하게되면 spring을 이용하든 안하든 proxy, cross cutting concern, core concern이 모두 있어야함.
이 세 개가 서로 도킹/ 분리가 자유로워야하는데 이를 더 쉽게 할 수 있게 돕는 것이 Spring이다.
곁다리 업무 로직을 사용할 때 여러 형태가 있는데 Spring에서는 그런 형태를 총 4가지로 나눈다.
ㄱ. Before Advice : 앞에만 필요한 곁다리업무
ㄴ. After returnning Advice : 뒤에만 필요한 곁다리 업무
ㄷ. After throwing Advice : 예외를 처리하는 곁다리 업무
ㄹ. Around Advice : 앞, 뒤로 필요한 곁다리 업무
-> 내가 구현하고자하는 형태와 가장 알맞는 구조의 인터페이스를 상속받아 구현해서 꽂아넣으면 됨.
Spring은 Proxy를 제공하고있지만 아래 실습에서는 그것을 쓰지 않고, Spring이 직접 제공하는 Proxy Class를 이용해 실습을 해봤다.
(1) xml 설정

우리는 맨 위의 실습에서 java로 AOP를 구현했었고
그때, 주 업무 로직 객체 생성, Proxy 생성, 곁다리업무인 핸들러를 설정해줬었음.
Spring에서는 이러한 설정들을 xml에서 해준다.
ㄱ. bean을 이용해 "exam"이라는 이름의 주 업무 로직 객체를 만든다.
ㄴ. logAroundAdvice는 곁다리 업무 로직에 포함되는 객체를 만든다.
ㄷ. proxy 객체를 만들게 되는데 property로 곁다리업무와 target에 해당하는 것을 설정해줌.
-> exam 객체를 setter함수를 통해 설정해주고,
interceptorNames라는 이름으로 곁다리 업무인 logAroundAdvice도 setter로 설정해줌.
(2) LogAroundAdvice - 곁다리 업무 로직

맨 위에서의 실습에서 invoke()의 역할은 주 업무 로직을 불러오는 것이었음.
여기서 invocation.proceed()도 같은 역할을 함.
결과값을 Object로 돌려준다.
(3) Program

맨 위에서 실습했던 자바로 proxy설정해줬던 부분을 주석처리함.
context에 setting.xml을 넣으면 이 설정을 읽고 만들어진 객체들은 IoC에 담기게 됨.
이때, context를 이용해서 "proxy"라는 이름의 bean을 불러와 proxy 변수에 담아줌.
주 업무 객체와 곁다리 업무가 DI돼있는 상태이므로 proxy.total(), proxy.avg()로 접근해도 결과가 정상적으로 출력됨.
'개발자 공부 > Spring' 카테고리의 다른 글
| AOP(4) - Advisor란? / Pointcuts / JoinPoint / Weaving (0) | 2023.04.10 |
|---|---|
| AOP(3) - Before Advice / After Returning Advice / Throwing Advice (0) | 2023.04.10 |
| AOP(1) - AOP란? (0) | 2023.04.07 |
| Spring(10) - XML Configuration -> Java Configuration (0) | 2023.03.28 |
| Spring (9) - Annotation을 이용한 객체 생성 / @Controller, @Repository, @Service (0) | 2023.03.28 |