AOP ( Aspect Oriented Programming )
AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다. 관점 지향은 쉽게 말해 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화하겠다는 것이다. 여기서 모듈화란 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것을 말한다.
예로들어 핵심적인 관점은 결국 우리가 적용하고자 하는 핵심 비즈니스 로직이 된다. 또한 부가적인 관점은 핵심 로직을 실행하기 위해서 행해지는 데이터베이스 연결, 로깅, 파일 입출력 등을 예로 들 수 있다.
기존에 OOP에서 바라보던 관점을 다르게 하여 부가기능적인 측면에서 보았을때 공통된 요소를 추출하자는 것입니다.
이때 가로(횡단) 영역의 공통된 부분을 잘라냈다고 하여, AOP를 크로스 컷팅(Cross-Cutting) 이라고 불리기도 합니다.
횡단 관심사 = 흩어진 관심사 = Cross-Cutting
AOP에서 각 관점을 기준으로 로직을 모듈화한다는 것은 코드들을 부분적으로 나누어서 모듈화하겠다는 의미다.
이때, 소스 코드상에서 다른 부분에 계속 반복해서 쓰는 코드들을 발견할 수 있는 데 이것을 흩어진 관심사 (Cross-cutting Concerns)라 부른다.
위와 같이 흩어진 관심사를 Aspect로 모듈화하고 핵심적인 비즈니스 로직에서 분리하여 재사용하겠다는 것이 AOP의 취지다.
AOP는 OOP를 대신하는 새로운 개념이 아니라, OOP를 더욱 OOP답게 사용할 수 있도록 도와주는 개념이다.
객체를 재사용함으로써 개발자들은 반복되는 코드의 양을 굉장히 많이 줄일수가 있었다.
그렇지만 객체의 재사용에도 불구하고 반복되는 코드를 없앨수는 없었는데, 예를 들어 로그, 권한 체크, 인증, 예외 처리 등 필수적으로 해야하기 때문에 소스에서 반복될 수 밖에 없는 부분도 있다.
AOP는 이러한 부분을 해결해준다.
기능을 비지니스 로직과 공통 모듈로 구분한 후에 개발자의 코드 밖에서 필요한 시점에 비지니스 로직에 삽입하여 실행되도록 한다. 즉, OOP에서는 공통적인 기능을 각 객체의 횡단으로 입력했다면, AOP는 공통적인 기능을 종단간으로 삽입할 수 있도록 한 것이다.
위의 이미지는 OOP에서 로직흐름을 보여준다.
계정, 게시판, 계좌이체 라는 로직을 처리할 때, 모두 똑같이 권한,로깅, 트랜잭션을 처리해줘야한다. 따라서 모든 로직에 똑같은 코드가 반복적으로 삽입될 수 밖에 없다.
즉, 권한, 로깅, 트랜잭션이라는 관심(Aspect)이 횡단으로 삽입이 되는 것이다.
그렇지만 AOP에서는 이러한 관심을 종단으로 삽입할 수 있도록 해준다.
AOP에서는 모든 관심을 종단으로 삽입시켜준다.
위의 이미지와 비교했을 때, 권한, 로깅, 트랜잭션과 같은 관심이 각 계층의 바깥쪽에서 종으로 연결이 된것을 볼 수 있다.
기존의 프로그래밍에서는 각 객체별로 처리했던 것을 각 관점별로 외부에서 접근을 하는것이 AOP의 핵심이다.
즉 개발자는 계정, 게시판, 계좌이체와 같은 기능을 만들고, 공통적인 관심을 처리하는 모듈을 분리해서 개발한 후, 필요한 시점에 자동으로 소스코드가 삽입되도록 하는것이다.
AOP 용어
출처: https://devbox.tistory.com/entry/spring-AOP-용어-설명 [장인개발자를 꿈꾸는 :: 기록하는 공간]
1) Aspect ( 관점 )
구현하고자 하는 횡단 관심사의 기능을 의미한다.
한개 이상의 Point-cut 과 Advice의 조합으로 만들어진다.
트랜잭션이나 보안 등이 Aspect의 좋은 예이다. 여러 객체에 공통으로 적용되는 공통 관점 사항을 에스펙트라 한다.
Aspect는 AOP의 중심단위, Advice와 Pointcut을 합친 것이다.(Advisor)
2) 조인포인트(Join point)
Aspect를 삽입하여 Advice가 적용될 수 있는 위치를 말한다.
클래스의 인스턴스 생성 시점', '메소드 호출 시점', '예외 발생 시점'과 같이 어플리케이션을 실행할 때 특정 작업이 시작되는 시점을 '조인포인트'라고 한다.
실행시의 처리 플로우에서 Advice를 위빙하는 포인트를 JointPoint라고 한다. 구체적으로는 메서드 호출이나 예외발생이라는 포인트를 Joinpoint라고 한다.
3) 어드바이스(Advice)
언제 공통 관심 기능을 핵심 로직에 적용할 지를 정의하고 있다.
예를 들어, '메서드를 호출하기 전'(언제)에 '트랜잭션을 시작한다.'(공통기능)기능을 적용한다는 것을 정의하고 있다.
Target 클래스에 조인 포인트에 삽입되어져 동작(적용할 기능)할 수 있는 코드를 '어드바이스'라 한다.
관점으로서 분리되고 실행시 모듈에 위빙된 구체적인 처리를 AOP에서는 Advice라고 한다.
Advice를 어디에서 위빙하는지는 뒤에 나오는 PointCut이라는 단위로 정의한다.
또한 Advice가 위빙되는 인스턴스를 '대상객체'라고 한다. advice는 Pointcut에서 지정한 Jointpoint에서 실행 되어야하는 코드이다.
Advice는 Join Point와 결합하여 동작하는 시점에 따라 5개로 구분된다.
- Before Advice : 조인포인트 전에 실행되는 advice
- After returning advice : 조인포인트에서 성공적으로 리턴 된 후 실행되는 advice
- After throwing advice : 예외가 발생하였을 경우 실행되는 advice
- After advice : 조인포인트에서 메서드의 실행결과에 상관없이 무조건 실행되는 advice,
자바의 finally와 비슷한 역할을 한다.
- Around advice : 조인포인트의 전 과정(전, 후)에 수행되는 advice
4) 포인트컷(PointCut)
여러 개의 조인포인트를 하나로 결합한 것을 포인트 컷이라 한다.
Advice를 적용할 조인 포인트를 선별하는 과정이나 그 기능을 정의한 모듈을 의미한다.
패턴매칭을 이용하여 어떤 조인포인트를 사용할 것인지 결정한다. Advice의 위빙 정의는 Pointcut을 대상으로 설정한다. 하나의 Pointcut에는 복수 Advice를 연결할 수 있다. 반대로 하나의 Advice를 복수 Pointcut에 연결하는 것도 가능하다.
Pointcut(교차점)은 JoinPoint(결합점)들을 선택하고 결합점의 환경정보를 수집하는 프로그램의 구조물이다. Target 클래스와 Advice가 결합(Weaving)될 때 둘 사이의 결합 규칙을 정의하는 것이다.
5) 타겟(Target)
어드바이스를 받을 대상, 즉 객체를 의미한다.
비지니스로직을 수행하는 클래스일수도 있지만, 프록시 객체(Object)가 될 수도 있다.
6) Weaving
Advice를 핵심 로직 코드에 적용하는 것을 weaving 이라고 한다.(분리한 관점을 여러 차례 모률에 삽입하는 것을 AOP에서는 위빙 (Weaving: 엮기)이라고 부른다.) 즉 공통 코드를 핵심 로직 코드에 삽입하는 것이 weaving이다.
어드바이스를 핵심 로직 코드에 삽입하는 것을 위빙이라고 한다.
Aspect를 target 객체에 제공하여 새로운 프록시 객체를 생성하는 과정을 말한다.
- 컴파일시에 Weaving 하기
- 클래스 로딩 시에 Weaving 하기
- 런타임 시에 Weaving 하기
7) proxy
대상 객체에 Advice가 적용된 후 생성된 객체
cp.) 언제,어디서,누가,무엇을,어떻게, 왜 할 때 AOP 걸어라.....
내가 원하는 메소드 실행할 때(언제)
객체(어디서)
로그를 찍는 기능(누가)
로그를(무엇을)
앞뒤로(어떻게)
cp.) AOP 핵심
1. 대상: Target
2. 적용할 기능: advice
3. 대상의 어디에서 적용할지 구체적인 명시:pointcut
aspect와 advice의 관계(추상 명사와 구체 명사의 관계)
advice라는 코드를 내가 만듬 로그를 찍는 기능 자체를 aspect라고 한다.