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