AOP 개념과 쓰임
# AOP : Aspect Oriented Programming
공통 관심사 -> 모듈화 (OOP 강화)
1.프록시기반
2.런타임 기반
3.인터페이스기반
@Around("execution(* com.codesquad.todo2.domain.project.ProjectService.addCard(..))") //Pointcut
public Object logAddCard(ProceedingJoinPoint joinPoint) throws Throwable {
Object[] args = joinPoint.getArgs();
Long projectId = (Long) args[0];
Long categoryId = (Long) args[1];
Long userId = (Long) args[3];
CardDto cardDto = (CardDto) joinPoint.proceed(); //형변환 필요
Long cardId = cardDto.getId();
String cardTitle = cardDto.getTitle();
String dstCategoryTitle = logService.findCategoryTitleById(categoryId);
Project project = projectService.findProjectByIdOrHandleNotFound(projectId);
Log log = new Log(userId, cardId, cardTitle, null, dstCategoryTitle, "added");
project.addLog(log);
projectService.saveProject(project);
return cardDto;
}
# 어노테이션
@Around : 타깃 메소드 전구역 (런타임 실행) -> 해당 메소드에서 실행 시킬 공통 로직은 joinpoint (연결점: Object 객체 -> 타겟 메소드에 들어오는 매개변수 data 와 비지니스로직을 실행 후 result data 값들을 가짐) 기준으로 타겟메소드 실행 전 과 후 타이밍을결정 -> joinPoint.getArgs() 는 전 / joinPoint.proceed() 는 후
@Before : 타깃 메소드 실행 전
@After : 타깃 메소드 실행 후
@AfterReturning : 타깃 메소드 정상 종료 후
@AfterThrowing : 타깃 메소드예오외 발생 시
#Aspect
관점 (공통단 로직)
#pointcut
적용 위치 지정자(지시자) == 타깃 메소드 / 타깃 어노테이션 등 [타깃 경로 / 타깃 속성 ] (with.스프링)
#joinpoint
연결지점 (기준시점)
aop적용 메소드에서 매개변수로 받으며 joinPoint.getArgs() 는 전 / joinPoint.proceed() 는 후
-> jointPoint.getArgs() 로 타깃 메소드 request 에 대한 매개변수를 담아 공통로직을 build 하며
request parame data 를 제어하므로 타깃메소드의 모델단 비즈니스 로직을 실행하기 전이 됨
그 다음 jointPoint.proceed() 를 호출하게 되면서 모델단 비즈니스 로직을 db 까지 모두 실행한 result data 로 제어하면서 타깃메소드를 최종 실행한 후가 됨
#Advice
언제 / 무엇을 ?
단순히 말해 , 해당 타깃메소드에 실행할 공통 로직
- Aspect = Advice들 (언제, 무엇을) + Pointcut들 (어디에) = 관심사
#AOP 를 적용할 아이템들 ?
1. logging
2. security
3. transaction
4. message
5 exception 등
ck