KIC/Spring

day64 - Spring Framework(스프링, AOP)

바차 2021. 9. 14. 23:46
반응형

 

[Main3.java]

package ch03_AOPXmlAnno;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import di06.Article;
import di06.ArticleNotFoundException;
import di06.Member;
import di06.MemberService;
import di06.ReadArticleService;
import di06.UpdateInfo;

public class Main3 {
	public static void main(String[] args) {
		
		String[] config = {"ch03_AOPXmlAnno/annotation.xml"}; 
		ApplicationContext ctx = new ClassPathXmlApplicationContext(config); 
		ReadArticleService service = ctx.getBean("readArticleService", ReadArticleService.class);
	
		try {
			Article a1 =  service.getArticleAndReadCnt(1); //A 
			Article a2 = service.getArticleAndReadCnt(1); //B 
			System.out.println("[main] a1 == a2 : " + (a1==a2));
			service.getArticleAndReadCnt(0); //C
		} catch (ArticleNotFoundException e) {
	
		System.out.println("[main]" + e.getMessage());
		}
		System.out.println();
		System.out.println("=== updateMemberInfoTraceAspect 연습");
		MemberService memberService = ctx.getBean("memberService", MemberService.class);
		memberService.regist(new Member());
		memberService.update("hong", new UpdateInfo());//traceAspect AOP 대상이 되는 메서드
		memberService.delete("hong2", "test");
	}
}

 

 

[LoggingAspect.java]

package di07;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Component
@Aspect
@Order(1)
public class LoggingAspect {
	final String publicMethod = "execution(public * di06.*Service.*(..))";
	
	@Before(publicMethod)
	public void before() {
		System.out.println("[LA]메서드 실행 전(before) 전처리 수행함.");
	}
	
	@AfterReturning(pointcut = publicMethod, returning = "ret")
	public void afterReturning(Object ret) {
		System.out.println("[LA]메서드 정상 처리(afterReturning) 후 수행함 리턴값: " + ret);
	}
	
	@AfterThrowing(pointcut = publicMethod, throwing = "ex")
	public void afterThrowing(Throwable ex) {
		System.out.println("[LA]메서드 예외 발생 후(afterThrowing) 수행함 예외:" +ex.getMessage());
	}
	
	@After(publicMethod)
	public void afterFinally() {
		System.out.println("[LA]메서드 실행 후(afterFinally) 후처리 수행함");
	}
}

 

[ArticleCacheAdvice.java]

package di07;

import java.util.HashMap;
import java.util.Map;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import di06.Article;

@Component
@Aspect
@Order(2)
public class ArticleCacheAdvice {
	private Map<Integer, Article> cache = new HashMap<Integer, Article>();
	
	@Around("execution(public * *..ReadArticleServiceImpl.*(..))")
	public Article cache(ProceedingJoinPoint joinPoint) throws Throwable {
		System.out.println("[ACA] cache before 실행");
		
		Integer id = (Integer)joinPoint.getArgs()[0];
		Article article = cache.get(id);
		if(article != null) {
			System.out.println("[ACA] cache에서 Article[" + id +"] 가져옴");
			return article;
		}
		Article ret = (Article)joinPoint.proceed();
		System.out.println("[ACA] cache after 실행");
		if(ret != null) {
			cache.put(id,  ret);
			System.out.println("[ACA] cache에 Article[" +id +"] 객체를 추가함");
		}
		return ret;
	}
}
300x250