1. AOP에 대하여 설명하시오.
1-1 AOP의 정의
: Aspect Oriented Programming의 약자로, 핵심기능과 공통기능을 분리하여 둘과 공통이 되는 기능들을 중점으로 구현하는 프로그래밍.
이를 통해 중복 코드 제거, 유지보수 향상, 높은 생산성, 재활용성 극대화, 변화 수용 용이의 이점을 얻을 수 있다.
1-2. AOP 용어
- Aspect: AOP가 적용된 객체들의 공통적인 기능
- Advice: Aspect의 세수사항 (변수 및 메소드)
- Jointpoint: Advice를 적용하는 부분 (Spring에서는 메소드에 해당)
- Pointcut: Jointpoint의 부분으로 실제 Advice가 적용된 부분
- Weaving: Advice를 핵심 기능에 적용하는 행위
2. AOP를 적용하기 위한 두가지 방법은?
2-1. XML을 이용한 AOP 구현
<bean id="logAdvice" class="edu.bit.ex.board.aop.LogAdvice" />
<bean id="logAop" class="edu.bit.ex.board.aop.LogAop" />
<aop:config>
<aop:aspect ref="logAdvice">
<aop:pointcut id="publicM" expression="within(edu.bit.ex.board.service.*)"/>
<aop:before pointcut-ref="publicM" method="printLogging" />
</aop:aspect>
</aop:config>
<aop:config>
<!-- aspect id는 logger이고, logAop를 참조함 -->
<aop:aspect ref="logAop">
<!-- pointcut(핵심 기능)의 id는 publicM이고, 해당 패키지에 있는 모든 클래스에 공통 기능을 적용 -->
<aop:pointcut id="publicM" expression="within(edu.bit.ex.board.service.*)"/>
<!-- loggerAop()라는 공통 기능을 publicM라는 pointcut에 적용 -->
<aop:around pointcut-ref="publicM" method="loggerAop" />
</aop:aspect>
</aop:config>
package edu.bit.ex.board.aop;
public class LogAdvice {
public void printLogging() {
System.out.println("=========로그기록Mk.1=========");
}
}
package edu.bit.ex.board.aop;
import org.aspectj.lang.ProceedingJoinPoint;
public class LogAop {
public Object loggerAop(ProceedingJoinPoint joinpoint) throws Throwable {
// LogAdvice 객체 작동 시간을 측정하기 위해 Jointpoint를 이용한 변수 선언
String signatureStr = joinpoint.getSignature().toShortString();
System.out.println(signatureStr + " is start.");
// 시간 설정
// 시작 시간을 설정한다(start time)
long st = System.currentTimeMillis();
// try ~ finally로 성능체크 기능을 구현한다.
try {
Object obj = joinpoint.proceed();
return obj;
} finally {
// 종료 시간을 설정한다(end time)
long et = System.currentTimeMillis();
System.out.println(signatureStr + " is finished.");
System.out.println(signatureStr + " 경과시간 : " + (et - st));
}
}
}
2-2. Annotation을 이용한 AOP 구현
<bean id="logAdvice" class="edu.bit.ex.board.aop.LogAdvice2" />
<bean id="logAop" class="edu.bit.ex.board.aop.LogAop2" />
<!-- AOP 객체에 어노테이션을 적용시키기 위해선 autoproxy 기능이 필요하다. -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
package edu.bit.ex.board.aop;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
// context xml파일에서 auto proxy 기능이 되었는지 확인한다!
@Component
@Aspect
public class LogAdvice2 {
@Before("within(edu.bit.ex.board.service.*)")
public void printLogging() {
System.out.println("=========로그기록Mk.2=========");
}
}
package edu.bit.ex.board.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
// context xml파일에서 auto proxy 기능이 되었는지 확인한다!
@Component
@Aspect
public class LogAop2 {
@Around("within(edu.bit.ex.board.service.*)")
public Object loggerAop(ProceedingJoinPoint joinpoint) throws Throwable {
String signatureStr = joinpoint.getSignature().toShortString();
System.out.println(signatureStr + " is start.");
long st = System.currentTimeMillis();
try {
Object obj = joinpoint.proceed();
return obj;
} finally {
long et = System.currentTimeMillis();
System.out.println(signatureStr + " is finished.");
System.out.println(signatureStr + " 경과시간 : " + (et - st));
}
}
}
'WebDev > 본과정' 카테고리의 다른 글
카카오톡 소셜로그인 (0) | 2021.05.17 |
---|---|
Spring Security (0) | 2021.05.17 |
Spring의 Interceptor와 부트스트랩 프론트엔드 프레임워크 (0) | 2021.05.17 |
Spring의 트랜잭션과 rollback 및 commit (0) | 2021.05.17 |
RESTful (0) | 2021.05.17 |
최근댓글