728x90
Aspect Oriented Programming
- 횡단 관심사(Cross-Cutting Concern)의 분리를 허용함으로써 모듈성을 증가시키는 것이 목적인 프로그래밍 패러다임
- 횡단관심사란?
- 애플리케이션 전반에 걸쳐서 공통적으로 필요한 기능을 의미
- 애플리케이션의 핵심 기능(BusinessLogic) 에 속하지 않는 시스템 서비스
- 예) Logging, Transaction, 권한 검사, 성능 측정
- 비즈니스 컴포넌트들과 복잡한 의존 관계 형성
- 횡단관심사란?
- 모듈성을 증가시키는 것이 목적인 프로그래밍 패러다임
- 소프트웨어 시스템 내부의 관심사들을 서로 분리시킴
- 공통 관심사항 적용 시 발생하는 의존 관계의 복잡성과 코드 중복문제를 해결하기 위한 프로그램 개발 방법론
- 공통 기능(시스템 서비스)을 분리해서 개발 및 모듈화하고 'aspect'를 정의하여 핵심기능(비즈니스 클래스)에 선언적으로 적용함.
- Business logic 실행 전.후에 공통 기능을 실행시킴
- 비즈니스 클래스와 시스템 서비스 사이의 의존성 해결
<aop>
Provides elements for declaring aspects and for automatically proxying @AspectJ annotated classes as Spring aspects.
용어정리
- Target : 어떤 대상에 부가 기능을 부여할 것인가
- Advice : 어떤 부가 기능 ?
- Before, AfterReturning, AfterThrowing, After, Around
- Join Point : 어디에 적용할 것인가?
- 메서드, 필드, 객체, 생성자 등
- Point cut
- 실제 Advice가 적용될 지점, Spring AOP 에서는 advice가 적용될 메서드를 선정
@Aspect
@Component
public class UselessAdvisor {
@Around("@annotation(PerformanceCheck)")
// PerformanceCheck : Custom Annotation
public Object stopWatch(ProceedingJoinPoint joinPoint) throws Throwable {
StopWatch stopWatch = new StopWatch();
try{
stopWatch.start();
return joinPoint.proceed();
} finally {
stopWatch.stop();
log.info("request spent {} ms", stopWatch.getLastTaskTimeMillis());
}
}
}
@PerformanceCheck // Custom Annotation 작성
// AOP를 호출하는 객체에서 private 인 메소드를 실행해주면 실행 안됨
private void inner() {
System.out.println("또오오옹");
}
여러 객체에 공통으로 적용할 수 있는 기능을 분리해서 개발자는 반복 작업을 줄이고 핵심기능에 집중할 수 있다.
프록시란?
- 자신이 클라이언트가 사용하려고 하는 실제 대상인 것처럼 위장해서 클라이언트의 요청을 받아주는 것(대리인, 대리자)
- 프록시 패턴 : 클라이언트가 타깃에 접근하는 방법을 제어하기 위해서
- 데코레이터 패턴 : 타깃에 부가적인 기능을 부여해주기 위해서
AOP 구현 방법
- 컴파일 시점에 코드에 공통 기능삽입
- J.java -> J.class로 컴파일하는 시점에 해당하는 aspect들을 끼워넣어주는 것
- AspectJ의 방법
- 클래스 로딩 시점에 바이트 코드에 공통 기능 삽입
- J.class 클래스 로더가 메모리상에 올릴때에 aspect들을 끼워넣어주는 것
- AspectJ의 방법
- 런타임 시점에 프록시 객체를 생성하여 공통 기능 삽입 -> Spring에서 제공하는 AOP방법
- J라는 어떤 타겟 클래스를 프록시로 감싸서, 부가기능을 제공하는 프록시로 감싸서 실행을 하는 방식
- 컴파일러나 클래스 로더 조작기를 설정하지 않아도 된다.
- 프록시는 메소드 오버라이딩 개념으로 동작하기 때문에, 스프링 AOP는 메서드 실행시점에만 AOP를 적용할 수 있다.
- 스프링 AOP는 스프링컨테이너가 관리할 수 있는 빈(@Component) 에만 AOP를 적용할 수 있다.
- Aspect J를 직접 사용하는 것이 아니라 AspectJ의 문법을 차용하고 프록시 방식의 AOP 적용함
728x90
'CS' 카테고리의 다른 글
URL의 이해 (0) | 2022.06.19 |
---|---|
오버로딩 vs 오버라이딩 (0) | 2022.04.18 |
Protocol (0) | 2022.03.18 |