[무지목록] aop를 알아보자
🤔 AOP (Aspect Oriented Programming) 란 무엇인가?
🔎 무지 발견
스프링 입문 강의를 듣던 중 AOP
가 나왔다. 입문 강의라서 짧게 다루고 넘어갔는데 평소 많이 들어는 봤지만 그래서 AOP
가 뭐야? 라는 질문에 답을 할 수 가 없어 무지목록에 집어넣었다.
💡 알아보기
애플리케이션의 핵심적인 기능에서 부가적인 기능을 분리해서 애스펙트라는 독특한 모듈로 만들어서 개발하는 방법을 애스펙트 지향 프로그래밍 ( AOP )라 한다.
애스팩트란?
애플리케이션의 핵심기능을 담고 있지는 않지만, 애플리케이션을 구성하는 중요한 한 가지 요소이고, 핵심기능에 부가되어 의미를 갖는 특별한 모듈을 가리킨다.
애스펙트는 부가될 기능을 정의한 코드인 어드바이스와, 어드바이스를 어디에 적용할지를 결정하는 포인트컷을 함께 갖고 있다.
그래서
부가기능을 분리하지 않으면 핵심기능이 부가기능 코드에 가려 안보일 수 있고 여러 메소드에 흩어져 나타나고 중복되게 된다.
AOP는 애스팩트를 분리함으로써 핵심기능을 설계하고 구현할 때 객체지향적인 가치를 지킬 수 있도록 도와주는 것이다.
결국 애플리케이션을 다양한 측면에서 독립적으로 모델링하고, 설계하고, 개발할 수 있도록 만들어준다. 애플리케이션을 특정한 관점을 기준으로 바라볼 수 있게 해준다는 의미로 관점 지향 프로그래밍라고도 한다.
🎯 실제 적용 사례
AOP 적용 전 📌
public List<Member> findMembers() {
long start = System.currentTimeMillis();
try {
return memberRepository.findAll();
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
System.out.println("findMembers " + timeMs + "ms");
}
}
=> 실행 시간을 측정, 핵심기능은 회원 목록을 조회하는 기능이지만 시간 측정을 하는 부가기능에 가려 코드가 잘 보이지 않는다. 또 실행 시간 측정을 모든 기능마다 추가하게 되면 해당 코드가 변경될 때 모든 기능을 찾아서 바꿔야하는 불상사가 일어난다.
AOP 적용 후 📌
@Aspect
@Component
public class TimeTraceAop {
@Around("execution(* com.hello.hellospring..*(..))")
public Object excute(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
System.out.println("START :" + joinPoint.toString());
try {
return joinPoint.proceed();
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
System.out.println("END: " + joinPoint.toString() + " " + timeMs + "ms");
}
}
}
@Aspect
: Aspect declaration@Around
: the pointcut expression where to bind the advice@Around("execution(* com.hello.hellospring..*(..))")
: 해당 패키지에 들어있는 모든 것에 적용
=> 프록시가 나타났다!!! 다음 무지 목록에서 알아보자
🎈 마무리
AOP에 대해 가볍게 알아보았다. 조금씩 더 깊이 알아보자