AOP
Aspect(관심사)
공통된 관심사?로 이해하면 쉽다.
여러 클래스에서 같은 로직(관심사)이 실행될 때 사용한다.
공통적인 로직을 클래스에 하나하나 추가하지 않고 별도의 클래스로 생성한다.
예를 들어 모든 로직의 수행시간을 측정하려고 한다.
//시작
StopWatch sw = new StopWatch();
sw.start();
//여러가지 로직들
//끝
sw.stop();
System.out.println(sw.prettyPrint());
공통된 로직이 모두 들어간다.
공통된 로직을 분리 후 실행하는방법
-컴파일
컴파일할때 코드를 넣어준다.
-바이트코드 조작
A.java -> A.Class 하고 실행 시 클래스 로더가 메모리에 올릴 때 조작한다.
컴파일, 바이트코드 조작의 차이점 코드가 아닌 메모리에 올라간다.
두 개다 AspectJ가 지원한다.
-프록시패턴(스프링AOP)
인터페이스 implements를 통해 구현한다.
한번 더 감싸는 구조로 생각하면 쉽다.
(
공통 로직
(실행 로직)
공통 로직
)
자동으로 bean 등록될 때 만들어진다.
애노테이션을 사용하여 AOP 적용한 예제
@LogExecutionTime을 만들어보기
@GetMapping("/owners/find")
//만들 애노테이션 명
@LogExecutionTime
public String initFindForm(Map<String, Object> model) {
model.put("owner", new Owner());
return "owners/findOwners";
}
구현할 애노테이션 생성
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogExecutionTime {
}
@Around로 ProceedingJoinPoint를 파라미터로 받는다.
ProceedingJoinPoint는 애노테이션을 설정한 타깃을 말한다.
즉 애노테이션 달려있는 메서드!
//bean으로 등록
@Component
//Aspect 설정
@Aspect
public class LogAspect {
Logger logger = LoggerFactory.getLogger(LogAspect.class);
@Around("@annotation(LogExecutionTime)")
public Object LogExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable{
StopWatch sw =new StopWatch();
sw.start();
//위애 애노테이션 달려있는 메소드 실행
Object procced= joinPoint.proceed();
sw.stop();
logger.info(sw.prettyPrint());
return procced;
}
}
같은 로직인데 여러 군데 들어간다면 AOP를 활용하는 게 좋다.
애노테이션을 쓰지 않는 방법도 있다.
여러 가지방법과 사용방법이 존재한다.
'개발 소발 > 개발 Spring' 카테고리의 다른 글
Spring Scope란? (0) | 2020.07.13 |
---|---|
Spring Autowired와 ComponentScan이란 (0) | 2020.07.10 |
Spring IoC(Inversion of Control),Bean,의존성주입이란? (0) | 2020.07.08 |
프레임워크 개념 (0) | 2018.01.26 |
SpringMVC란? (0) | 2018.01.11 |