AOP 개념 및 Spring의 AOP 기능
Spring Framework – AOP 절차적 프로그래밍 OOP AOP
Spring Framework – AOP 다음 문제의 정답은? 1 11 12 1121 122111 112213 ???????
Spring Framework – AOP 사고의 전환
Spring Framework - AOP 요구사항!! MessageRenderer, MessageProvider의 모든 메써드 시작과 종료시 “MethodName 시작”, “MethodName 종료”라는 Logging 메시지를 출력한다.
Spring Framework - AOP
Spring Framework - AOP 요구사항 변경!! MessageRenderer, MessageProvider의 모든 메써드 시작과 종료시 “MethodName Start”, “MethodName End”라는 Logging 메시지를 출력한다.
Spring Framework - AOP 요구사항 변경!! 메써드로 전달되는 인자를 Logging 메시지로 출력한다. MessageRenderer, MessageProvider의 모든 메써드 시작과 종료시 “MethodName Start”, “MethodName End”라는 Logging 메시지를 출력한다. 메써드로 전달되는 인자를 Logging 메시지로 출력한다.
Spring Framework - AOP 삽질의 연속
Spring Framework - AOP
Spring Framework - AOP 요구사항!! 비즈니스 계층과 퍼시스턴스 계층의 모든 메써드 시작과 종료시 “메써드 시작”, “메써드 종료”라는 Logging 메시지를 출력한다. 또한 메써드에 인자를 출력한다. Runtime Exception이 발생할 경우 시스템 관리자에게 에러 메시지에 대한 메일을 발송한다.
Spring Framework – AOP
지금까지의 구현 방법 - UserServiceImpl public User findUser(String userId) throws UserNotFoundException { if (logger.isDebugEnabled()) { logger.debug("findUser() 시작"); logger.debug("User ID : " + userId); } User user = userDAO.findUser(userId); if (user == null) { throw new UserNotFoundException(context.getMessage( "user.notfound.exception", new Object[] { userId }, null)); logger.debug(userId + " 사용자 정보 : " + user); logger.debug("findUser() 종료"); return user;
Spring Framework – AOP AOP를 이용한 해결 방법
AOP 적용 - UserServiceImpl public User findUser(String userId) throws UserNotFoundException { User user = userDAO.findUser(userId); if (user == null) { throw new UserNotFoundException(context.getMessage( "user.notfound.exception", new Object[] { userId }, null)); } if (logger.isDebugEnabled()) { logger.debug(userId + " 사용자 정보 : " + user); return user;
AOP 적용 – LoggingAdvice public class UserLoggingAdvice implements MethodInterceptor { protected final Log logger = LogFactory.getLog(getClass()); public Object invoke(MethodInvocation invocation) throws Throwable { String className = invocation.getThis().getClass().getName(); if (logger.isDebugEnabled()) { logger.debug(className + "." + invocation.getMethod().getName() + "()" + " 시작!!"); Object[] args = invocation.getArguments(); if ((args != null) && (args.length > 0)) { for (int i = 0; i < args.length; i++) { logger.debug("Argument[" + i + "] : " + args[i]); } //Target 클래스의 메써드를 실행한다. Object retVal = invocation.proceed(); + " 종료!!"); return retVal;
Spring Framework – AOP
Logging Poincut public boolean matches(Method method, Class cls) { public class LoggingPointcut extends StaticMethodMatcherPointcut { public boolean matches(Method method, Class cls) { if( "findUser".equals(method.getName()) ) { return true; } return false; public ClassFilter getClassFilter() { return new ClassFilter() { public boolean matches(Class cls) { return (cls == UserServiceImpl.class) || (cls == MySQLUserDAO.class); };
Spring Framework – AOP
Spring Framework - AOP
Spring Framework - AOP
Spring Framework – AOP 샘플 애플리케이션 개발 및 분석 (Spring 프레임워크 워크북 3장)
Join point Spring Framework – AOP 프로그램이 실행되는 중 식별할 수 있는 Point. 예를 들어 메써드의 실행, Exception Handling 등이 포함된다.
Advice Spring Framework – AOP Join Point에서 Aspect에 의하여 실행되는 Action을 의미 예를 들어 Logging Aspect일 경우 Join Point에서 Logging 하는 것을 의미한다.
Advice 의 종류 Spring Framework – AOP Before advice : Join Point 전에 실행되는 Advice. Around advice : Join Point 전, 후에 실행되는 Advice. After returning advice : Joint Point 완료된 후에 실행되는 Advice After throwing advice : Exception Throwing이 될 때 실행되는 Advice After (finally) advice : After returning advice, After throwing advice 모든 경우에 실행
Before Advice Spring Framework – AOP @Before("com.xyz.myapp.SystemArchitecture.dataAccessOperation()") public void doAccessCheck() { // ... }
After Returning Advice Spring Framework – AOP After Returning Advice @AfterReturning( pointcut="com.xyz.myapp.SystemArchitecture.dataAccessOperation()", returning="retVal") public void doAccessCheck(Object retVal) { // ... }
After Throwing Advice Spring Framework – AOP @AfterThrowing( pointcut="com.xyz.myapp.SystemArchitecture.dataAccessOperation()", throwing="ex") public void doRecoveryActions(DataAccessException ex) { // ... }
After (finally) Advice Spring Framework – AOP After (finally) Advice @After("com.xyz.myapp.SystemArchitecture.dataAccessOperation()") public void doReleaseLock() { // ... }
Around Advice Spring Framework – AOP @Around("com.xyz.myapp.SystemArchitecture.businessService()") public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable { // start stopwatch Object retVal = pjp.proceed(); // stop stopwatch return retVal; }
Pointcut Spring Framework – AOP Join Point들을 선택하는 규칙을 정의하는 것. Weaving Rule을 정의하는 것
Pointcut의 종류 – Spring 1.x Spring Framework – AOP StaticMethodMatcherPointcut DynamicMethodMatcherPointcut Perl5RegexpMethodPointcut JdkRegexpMethodPointcut NameMatchMethodPointcut ComposablePointcut ControlFlowPointcut
Pointcut의 종류 – Spring 2.0 Spring Framework – AOP execution within this target args
Pointcut의 종류 – Spring 2.0 Spring Framework – AOP @target @args @within @annotation &&, ||, !
Pointcut의 예제 – Spring 2.0 Spring Framework – AOP execution(* com.xyz.service.AccountService.*(..)) within(com.xyz.service.*) this(com.xyz.service.AccountService) @target(org.springframework.transaction.annotation.Transactional) @within(org.springframework.transaction.annotation.Transactional) @args(com.xyz.security.Classified)
Aspect Spring Framework – AOP 하나의 Crosscutting Concern을 Aspect로 정의 가능 Advice와 Pointcut이 결합되어 Aspect가 된다. 예를 들어 Transaction, Security등이 하나의 Aspect가 된다.
Target Object Spring Framework – AOP Aspect에 의하여 Advice가 적용되는 Object
Weaving Spring Framework – AOP Advcie, Pointcut, Target Object로 분리된 것을 하나로 결합하는 것을 의미 Weaving 작업을 지원하는 Tool(AspectJ, Spring AOP)을 Weaver라 지칭
Spring Framework - AOP AOP를 적용하기 전의 소스 구조
Spring Framework - AOP AOP를 적용 후
Spring Framework - AOP
Spring Framework - AOP 요구사항!! Runtime Exception이 발생할 경우 시스템 관리자에게 에러 메시지에 대한 메일을 발송한다.
Spring Framework - AOP 요구사항!! UserServiceImpl의 updateUser()는 “admin”, removeUser는 “admin” 권한을 가진 사용자만 접근이 가능하도록 해라.
Spring Framework - AOP
AOP 적용 단계
AOP를 DDD에 적용
AOP를 DDD에 적용
AOP를 DDD에 적용
AOP를 DDD에 적용
AOP를 DDD에 적용
AOP를 DDD에 적용
AOP를 DDD에 적용
과제 요구사항!! DAO 클래스의 메써드 실행속도가 500ms이 넘을 경우 Warning 메시지를 출력한다.