AOP(Aspect Oriented Programming)
OOP 방식의 프로그래밍을 했을 때 여러 곳에서 공통적으로 사용되는 부가 기능의 중복 코드가 발생하게 된다.
-> 관심 지향 프로그래밍(AOP)은 OOP 방식의 불필요한 반복을 해결하기 위한 방법이다. (핵심 기능과 부가 기능을 분리)
애스팩트(Aspect)
- 여러 객체에 공통적으로 적용되는 기능을 의미한다. (어드바이스 + 포인트컷)
어드바이스(Advice)
- Aspect를
언제
핵심 코드에 적용할 지를 정의한다.
조인포인트에서 수행되는 코드
를 의미한다.
- 종류
- Before Advice, After Returning Advice, After Throwing Advice, After Advice, Around Advice
-> 이 중 널리 사용되는 것은 Around Advice이다.
(대상 객체의 메서드를 실행 전, 후 또는 익셉션 발생 시점 등 다양한 시점에 원하는 기능 삽입 가능)
- @Around의 경우 반드시 proceed() 메소드가 호출되어야 한다. proceed() 메소드는 타겟 메소드를 지칭하기 때문에 proceed 메소드를 실행시켜야만 타겟 메소드가 수행이 된다.
조인 포인트(join point)
- Advice를
적용 가능한 지점
들을 의미한다.
- 스프링 AOP는 프록시 방식을 사용하므로 조인 포인트는 항상 메소드 실행 지점으로 제한된다.
- JoinPoint 메소드는 어드바이스의 종류에 따라 사용방법이 다소 다르지만 기본적으로 어드바이스 메소드에 매개변수로 선언만 하면 된다.
포인트컷(Pointcut)
- 조인 포인트 중에서
어드바이스가 적용될 위치
를 선별하는 기능
- AspectJ 표현식을 사용해서 지정한다.
타겟 (Target)
핵심 기능을 담고 있는 모듈
로, 타겟은 부가기능을 부여할 대상
이 된다.
- Adivce를 받는 객체이고 포인트컷으로 결정된다.
위빙(Weaving)
- 포인트컷으로 결정한 타겟의
조인 포인트에 어드바이스를 적용하는 것
- 지정된 객체에 애스팩트를 적용해서 새로운 프록시 객체를 생성하는 과정
- AOP 적용을 위해 애스펙트 객체에 연결한 상태
AOP 프록시(proxy)
- 핵심 기능의 실행은 다른 객체에 위임하고 부가적인 기능을 제공하는 객체
- 타겟을 감싸서 타겟의 요청을 대신 받아주는 랩핑(Wrapping) 오브젝트
- AOP에서 프록시는 호출을 가로챈 후, 어드바이스에 등록된 기능을 수행 후 타겟 메소드를 호출한다.