AOP(Aspect Oriented Programming)
AOP(Aspect Oriented Programming)
객체지향 프로그래밍을 보완하는 개념으로, 애플리케이션을 객체지향적으로 모듈화하여 작성하더라도 다수의 객체들에 분산되어 중복적으로 존재하는 공통 관심사가 여전히 존재한다.
AOP는 이를 횡단 관심(Crosscutting Concern)으로 분리하여 핵심 관심(Core Concern)과 엮어서 처리할 수 있는 방법을 제공한다.
로깅, 보안, 트랜잭션 등 핵심 기능이 아닌 공통 부가 기능의 활용을 기존의 비즈니스 로직에 영향을 주지 않고 모듈화 처리를 지원하는 프로그래밍 기법이다.
Spring에서 AOP는 런타임에 프록시 기반으로 메서드(서비스) 단위로 적용된다.
JoinPoint
횡단 관심 모듈이 삽입되어 동작할 수 있는 실행 가능한 특정 위치를 의미한다.
Spring에는 총 5가지 JoinPoint가 존재하는데 각각
Before : 메서드 호출시 바로
After Throwing : 예외가 발생했을 때
After : 동작이 끝난 뒤에 (성공적으로 수행된 경우, 에러가 발생한 경우 모두 해당)
After Returning : 리턴 직후에 (에러 없이 성공적으로 실행)
Around : 전 범위에 걸쳐서
를 의미한다.
PointCut
메서드 선정 알고리즘
어떤 클래스의 어느 JoinPoint를 사용할 것이지 결정하는 선택 기능을 말한다.
어떤 메서드(서비스)에 해당 기능을 추가할지 결정한다.
Advice
특정 Join Point에 실행되는 코드
즉, 앞에서 서술한 핵심 기능에 영향을 미치지 않는 따로 떼어낸 부가 기능이다.
Aspect
Advice + PointCut
애플리케이션이 가지고 있어야 할 로직과 그것을 실행하는 지점을 정의한 것이다.
Weaving
PointCut에 의해 결정된 JoinPoint에 지정된 Advice를 삽입하는 과정을 의미한다.
AOP가 기존의 횡단 관심 모듈의 코드에 전혀 영향을 주지 않으면서 필요한 횡단 관심 기능을 추가할 수 있게 해주는 핵심적인 처리 과정이다.
Spring에서는 프록시 기반으로 런타임 Weaving 방식을 지원한다.
예시
로그를 남기는 기능 = 부가 기능 = Advice
어느 위치에 기능을 넣을 것인지 = JoinPoint
어떤 서비스에 그 기능을 넣을 것인지 = PointCut
로그를 남기는 기능을 어떤 서비스의 어느 위치에서 작동 시킬 것인지 = Advice + PointCut = Aspect