AOP란?
Aspect-Oriented Programming은 소프트웨어 개발의 한 패러다임으로, 앱의 공통 관심사(Cross-Cutting Concerns)를 모듈화하는 데에 중점을 둔다.
AOP의 기본개념?
- 공통 관심사 Cross-cutting concerns: 앱의 여러 부분에서 공통적으로 필요한 기능을 말함. 예를 들어 로깅, 트랜잭션 관리, 보안, 예외처리 등. 이러한 기능들은 앱의 핵심 비즈니스 로직이 아니지만, 많은 클래스 혹은 메서드에서 필요로하는 기능이다.
- 관점 Aspect: 공통 관심사를 모듈화한 단위를 aspect라고 함.
- 그 외에도 위빙, 조인 포인트, 포인트컷, 어드바이스 등의 개념들이 있다.
AOP가 필요한 상황?
* 모든 메소드의 호출 시간을 측정하고 싶을 때, 모든 메소드의 앞뒤로 측정 메소드를 붙일 수는 없는 노릇 아닌가?
이때 쓰는 게 AOP다.
예를 들어
이런 상황에서 AOP를 쓰면,
이런 식의 형태가 가능하다는 것이다.
참고로 AOP는 보통 프록시를 사용한다. DI를 해주기 때문에 이게 기술적으로 가능하다는 것을 알 수 있다.
사용방법
1 가장 상단에 aop 패키지를 만들어서 TimeTraceAop라는 기능을 가진 모듈을 만들어준다.
2 @Aspect 애노테이션 붙여주고, 템플릿에 맞춰 함수를 짜준다. 예를 들어 시간 재는 녀석은 TimcTraceAop.
package hello.hellospring.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class TimeTraceAop {
@Around("execution(* hello.hellospring..*(..))")
public Object execute(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");
}
}
}
3 어디에 적용하는지는 @Around를 써서 특정해준다.
4 예시처럼 컴포넌트 스캔을 써도 되지만, 보통 AOP는 꽤나 특이한 녀석이기 때문에 bean에 직접 등록해주면 좋다.
=> AOP라 하면 뭐라뭐라 말이 많다. 그 중 실무에서 쓰는 건 5%도 안 된다고 저자는 단언한다. 즉 AOP는 고마운 도구 정도로 여기면 될 것 같다.
'백엔드 잡학사전' 카테고리의 다른 글
[스프링 핵심] 비즈니스 요구사항 맞춰 설계 및 순수 JAVA로 구현 (0) | 2024.08.14 |
---|---|
[스프링 핵심] 스프링과 객체 지향 프로그래밍 (0) | 2024.08.12 |
[스프링 입문] 스프링에서의 DB 접근 기술 (0) | 2024.08.11 |
[스프링 입문] 스프링 빈과 의존관계 & MVC 개발하기 예시 (0) | 2024.08.10 |
[스프링 입문] 회원 관리 예제의 백엔드 개발 & 의존성 주입 (0) | 2024.08.10 |