프락시 클래스에 구현되는 Cross-cutting Concern
보조 업무의 위치에 따라 Before, After returnning, After throwing, Around
앞에만 필요한 보조 업무를 Before Advice
뒤에만 필요한 보조 업무를 After returnning Advice,
예외를 처리하는 보조 업무를 After throwing Advice,
앞뒤 모두 필요한 보조 업무를 Around Advice라고 함.
이 네가지 중 필요한 한 가지를 상속받아 구현
spring을 쓰기 위해 설정 작업을 수행한다.
기존의 setting.xml 파일을 spring.aop 패키지로 복사해서 가져옴.
그 후 spring.di 패키지에 있는 program 클래스에서 해당 ApplicationContext 문을 복사하여
spring.aop 패키지에 program 클래스의 윗부분에 삽입함.
그 후
- xml을 사용할 ApplicationContext의 경로를 "spring/aop/setting.xml 경로로 변경하기(ClassPathXmlApplicationContext
- 자동 import(ctrl+shift+o)
- 객체 생성
Exam exam = new NewlecExam(1,1,1,1);
- proxy 생성 및 보조 업무 코드
Exam proxy = (Exam) Proxy.newProxyInstance(NewlecExam.class.getClassLoader(),
new Class[] {Exam.class},
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
long start = System.currentTimeMillis();
Object result = method.invoke(exam, args);
long end = System.currentTimeMillis();
String message = (end - start) + "ms 시간이 걸렸습니다";
System.out.println(message);
return result;
}
});
그 후
- spring.aop패키지에서 필요없는 소스들 삭제
- 클래스명을 다 외우기 힘듦으로 program.java에 가서 org.springframwork.aop.framework. 하다보면 ProxyFactoryBean이 나온다. 잘라내기 후 붙여넣기
- 아래처럼 셋팅 ( 정정 : target class = "spring.aop.entity.NewlecExam" "spring.aop.copy.NewlecExam"
- logAroundAdvice" class = "spring.aop.advice.LogAroundAdvice" />
- property는 원래 setTarget인데 , 약속으로써 target으로만 씀. setter 함수 만들기
- target은 ref인지 value인지 판단하여 사용. 위의 target은 ref형식.
- 우리는 target과 handler만 만들어주면 됨
- value는 참조열이기 때문에 참조하고있는 친구의 이름을 삽입하면 됨
- interceptorNames 속성을 활용하여 복수형으로 여러개의 곁다리 업무 코드를 가질 수 있으며 list 태그를 통해 객체를 추가할 수 있음
- spring.aop.advice 패키지 하위의 LogAroundAdvice 클래스를 생성한다.
- implements MethodInterceptor를 해주고, 빨간 밑줄이 뜨는 클래스 명에다가 마우스를 갖다대어 구현할 목록을 생성한다.
위의 코드가
아래의 코드처럼 변환되었다.
- exam, args와 같은 파라미터들이 제거되고 proceed 함수로 대체됨.
위의 소스 코드를 제외한 나머지 코드들을 주석처리하고
- proxy 가 필요하니 Exam proxy = 를 적어주고
context를 통해서 "proxy"를 얻어와야 하니 getBean(); 메서드를 사용한다.
이름을 통해서 얻어온 것이므로 형변환이 필요하므로 (Exam)이 붙는다.
- 장점 : 코드를 직접 건들지 않고 끼웠다 뺐다할 수 있음
참고영상 : https://www.youtube.com/watch?v=eHYPujubB3E&list=PLq8wAnVUcTFVUMCKI4CL_EHWW5ykPnL0z&index=4
'개발공부 > Spring' 카테고리의 다른 글
[spring] After Returning /Throwing 어드바이스 구현하기 (0) | 2022.01.26 |
---|---|
[spring] BeforeAdvice 구현하기 (0) | 2022.01.26 |
[spring] AOP 자바 코드 이해하기 (0) | 2022.01.26 |
[spring] AOP(Aspect Oriented Programming)이란? (0) | 2022.01.26 |
[spring] XML Configuration을 Java Configuration으로 변경하기 (0) | 2022.01.26 |