반응형
AOP란
관점에 따라서 프로그램을 만드는 방식입니다. 우리는 보통 사용자의 관점에서만 프로그램을 만들었습니다.
객체지향보다 더 큰 단위인 AOP는 개발자, 운영자들의 관점에 대해 프로그램을 만들 것인가? 하는 이야기입니다.
로그 처리 (성능 테스트) , 보안 처리 , 트랜잭션 처리 등등 을 위해 Croos-cutting Concern이 되며
주 업무 로직 사용자가 요청한 서비스를 Primary Concern으로 표현됩니다.
우리는 주 업무 로직과 크로스커팅을 합칠 일이 많았습니다. 과거에는 이러한 Core Concern와 Cross-cutting Concern을 합칠 때 크로스커팅을 주석 처리했다가 풀었다가 하는 일이 많았습니다. 관점이 다른 코드를 을 쉽게 뺏다 꽂았다 하는 방법을 생각하다 보니 나온 방법론이 AOP입니다. 프락시를 이용해 주 업무가 실행될 때 앞 뒤로 크로스 컷팅 로직이 자동으로 실행되도록 spring에서 도움을 제공합니다.
AOP 구현 방식
만약 비즈니스 로직에 대하여 걸리는 시간을 알고 싶은 경우
public static void main(String[] args){
Exam exam = new Exam();
Exam examProxy = =(Exam) Proxy.newProxyInstance(Exam.getClassLoader), new Class[]{Exam.class},
new InvocationHandler(){
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
//Cross-cutting Concern
long start = System.currentTimeMillis();
SimpleDateFormat dayTime = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String str = dayTime.format(start);
System.out.println(str);
-------------------------------
//int result =kor+ eng + math;
Object result = method.invoke(exam, args);
/실질적인 메소드
---------------------------
long end = System.currentTimeMillis();
String message = (end-start)+ "가 걸림";
System.out.println(message);
//Cross-cutting Concern
---------------------------------
return result;
}
}
public int total() {
}
}
이렇게 작성할 수 있으면 업무 로직과 상관없는 다른 코드들을 같이 넣었지만 만약 업무 로직을 구현하는 소스코드가 없다면 로직을 넣을 수가 없기에 테스트 코드 자체를 넣는 것이 불가능해졌습니다.
AOP는 이러한 코드를 분리합니다.
Cross-cutting Concern
long start = System.currentTimeMillis();
SimpleDateFormat dayTime = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String str = dayTime.format(start);
System.out.println(str);
-------------------------------
---------------------------
long end = System.currentTimeMillis();
String message = (end-start)+ "가 걸림";
System.out.println(message);
Core Concern
public int total() {
int result =kor+ eng + math;
return result;
}
package spring;
public class Program {
public static void main(String[] args) {
Exam exam = new NewExam();
Exam proxy = (Exam) Proxy.newProxyInstance(NewExam.class.getClassLoader(), new Class[]{Exam.class},
new InvocationHandler(){
//만약 NewExam이 여러개의 인터페이스가 존재하면 2번째인자에 배열형식으로나열
@Override
public Object invoke(Object proxy , Method method, Object[] args){
long start = System.currentTimeMillis();
Object result = method.invoke(exam, args);
//첫번째 인자 실제업무객체 , 두번째 인자 메소드가 가지고있는 파라미터
long end = System.currentTimeMillis();
return result;
}
})
}
}
즉 AOP는 곁다리 업무를 끼어넣을 수 있도록 도와줍니다.
반응형
'Spring|Spring-boot > Spring AOP' 카테고리의 다른 글
Pointcut - within, args (0) | 2022.01.29 |
---|---|
Pointcut - execution (0) | 2022.01.29 |
Spring AOP (2) (0) | 2022.01.29 |
Spring AOP (0) | 2022.01.27 |
[Spring boot] AOP 활용예제 (0) | 2021.06.09 |
댓글