Spring의 핵심 개념중 하나이며 관점지향 프로그래밍을 의미한다.
관점지향 프로그래밍이란 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 나누어진 관점들을 기준으로 각각 모듈화 하겠다는 의미다. 여기서 모듈화란 어떤 공통된 로직이나 기능을 하나의 단위로 묶는것을 의미한다.
예를들어 핵심적인 관점이란 개발자가 적용하고자 하는 핵심 비즈니스 로직이 된다. 또한 부가적인 관점은 핵심 로직을 실행하기 위해서 행해지는 데이터베이스 연결, 로깅, 파일 입출력 등을 예로 들 수 있다.
AOP에서 각 관점을 기준으로 모듈화한다는 것은 코드들을 부분적으로 나누어 모듈화하겠다는 의미가 된다. 이때, 소스 코드상에서 수행되는 비즈니스 로직은 다르지만 공통적으로 반복 사용되는 코드들을 발견할 수 있는 데 이것을 흩어진 관심사 (Crosscutting Concerns)라 부른다.
위와 같이 흩어진 관심사를 Aspect로 모듈화 하고 핵심적인 비즈니스 로직에서 분리하여 재사용하겠다는 것이 AOP의 취지이다.
Advice : 실질적으로 부가기능을 담은 구현체 Aspect가 '무엇'을 '언제' 할지에 대한 정의를 담고있다.
Spring AOP 어노테이션
- @Aspect : 해당 어노테이션을 붙여줌으로써 이 클래스는 Aspect를 나타내는 클래스라는 것을 명시하고 @Component를 붙여 스프링 빈으로 등록
- @Before(이전): 어드바이스 타겟 메소드가 호출되기 전에 어드바이스 기능을 수행
- @After(이후): 타겟 메소드의 결과와 관계 없이 타겟 메소드가 완료되면 어드바이스 기능을 수행
- @AfterReturning(정상적 반환): 타겟 메소드가 성공적으로 결과값을 반환 후에 어드바이스 기능을 수행
- @AfterThrowing(예외 발생): 타겟 메소드가 로직을 수행하던 중 예외가 발생하면 어드바이스 기능을 수행
- @Around(메소드 실행 전후): 어드바이스가 타겟 메소드를 감싸서 타겟 메소드 호출전과 후에 어드바이스 기능를 수행
Aspect: 위에서 설명한 흩어진 관심사를 모듈화 한것. 주로 부가기능들을 모듈화한다.
Target: Aspect를 적용하는 곳(클래스, 메소드..)
Advice: 실질적으로 어떤 일을 해야할 지에 대한 것, 실질적인 부가기능을 담은 구현체
JointPoint : Advice가 적용될 위치, 끼어들 수 있는 지점. 메서드 진입 지점, 생성자 호출 시점, 필드에서 값을 꺼내올 때 등 다양한 시점에 적용가능
PointCut : JointPoint의 상세한 스펙을 정의한 것. 'A란 메서드의 진입 시점에 호출할 것'과 같이 더욱 구체적으로 Advice가 실행될 지점을 정할 수 있음
Proxy : 타겟을 감싸서 타겟의 요청을 대신 받아주는 랩핑 오브젝트. 클라이언트에서 타겟을 호출하면, 타겟을 감싸고 있는 프록시가 호출되며, 타겟 메소드 실행 전 선처리, 실행 후 후처리를 실행시키도록 구성되어있다.
프록시는 호출을 가로챈 후, 어드바이스에 등록된 기능을 수행한다. 수행이 끝나면 타겟 메소드를 호출한다. @Transactional 어노테이션이 대표적인 예시다.
Introduction : 타겟 클래스에 코드 변경없이 신규 메소드나 멤버변수를 추가하는 기능
Weaving : 지정된 객체에 Aspect를 적용해 새로운 프록시 객체를 생성하는 과정. A 객체에 트랜잭션 Aspect가 지정되어 있다면, A라는 객체가 실행되기전 커넥션을 오픈하고 실행이 끝나면 커넥션을 종료하는 기능이 추가된 프록시 객체가 생성되고, 이 프록시 객체가 앞으로 A 객체가 호출되는 시점에 사용된다. 이때의 프록시 객체가 생성되는 과정을 Weaving(위빙)이라고 한다. Spring AOP는 런타임 시점에서 프록시 객체가 생성된다.