AOP란
Aspect-Oriented Programming 의 약자이다.
서로 다른 곳에서 사용되고 있는 Aspect(관점) 들을 모아 모듈화 하는 기법이다.
즉, 다시 말해 Aspect 은 여러 곳에서 공통으로 적용되는 기능을 의미한다. (e.g. 로깅, 트랜잭션, 접근 제어 등의 보안)
용어 정리
Target Object
부가 기능을 부여할 대상
- Spring 에서는 대게 Service 계층이 해당
Advice
부가 기능을 정의한 구현체 Aspect가 어느 시점에 적용이 될 지를 결정
아래의 여러 어노테이션을 통해 적용 시점을 변경시킬 수 있다.
- @Before
- 메소드 실행 전 기능 수행
- @After
- 메소드 결과와 상관없이 메소드가 완료 된 이후에 기능 수행
- @AfterReturning
- 메소드가 성공적으로 완료 된 이후에 기능 수행
- @AfterThrowing
- 메소드 수행 중 예외 발생 시 이후에 기능 수행
- @Around
- 메소드가 실행되기 전과 후 기능 수행
- proceed() 메소드 호출 전, 후를 통해 구분할 수 있다.
- 메소드가 실행되기 전과 후 기능 수행
Joinpoint
Advice를 적용 가능한 지점을 의미 (메소드 호출, 필드값 변경 등이 이에 해당)
Spring AOP 의 경우 프록시 기반이기에 메소드 실행에 대한 JointPoint만 지원한다. 이 외 (필드값 변경 등)에 적용하고 싶다면 AspectJ를 사용해야 한다
Pointcut
Aspect(부가 기능)가 적용될 대상을 선정하는 방법을 정의한 모듈
Spring은 기본적으로 AspectJ 포인트컷 표현식 언어를 사용
Aspect 는 Pointcut 표현식에 맞고, JoinPoint에 해당하는 지점에서 실행된다
Weaving
Advice를 핵심 로직 코드에 적용하는것을 의미하며 3가지 방식이 존재한다.
- 컴파일 타임 (Compile-time Weaving)
- AspectJ 사용
- 자바 파일을 클래스 파일로 만들 때, 바이트 코드를 조작하여, 조작된 바이트 코드를 생성
- 즉, Aspect(부가 기능)가 해당 class 파일에 포함되어 있어야 한다.
- 로드 타임 (Class Load-time Weaving)
- AspectJ 사용
- 순수하게 자바 파일은 클래스 파일로 컴파일 되며, 해당 클래스 파일을 로딩하는 시점에 해당 로직을 끼워넣는 방식
- 즉, 클래스 파일 자체의 바이트 코드는 변함이 없으며, JVM에 로딩한 메모리엔 Aspect가 포함되어 있는 것
- 런타임 (Run-time Weaving)
- Spring AOP 가 사용하는 방식
- 소스코드나 클래스 정보 자체를 변경하지 않고 중간에 프록시 객체를 생성하여 Aspect 를 적용한다.
참조
'Spring' 카테고리의 다른 글
Singleton Container - 웹 애플리케이션과 Singleton (0) | 2020.12.02 |
---|---|
Spring Bean 설정 메타 정보 - BeanDefinition (0) | 2020.12.01 |
Spring 의 다양한 설정 형식 지원 - 자바 코드, XML (0) | 2020.11.30 |
BeanFactory 와 ApplicationContext (0) | 2020.11.29 |
관심사의 분리 (0) | 2020.11.12 |
댓글