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