2020-12-28 Topic!
Aspect Oriented Programming 의 약자로 관점 지향 프로그래밍이라고 불린다.
관점 지향은 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로
각각 모듈화하겠다는 것이다.
여기서 모듈화란 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것을 말한다.
예) 핵심적인 관점은 결국 우리가 적용하고자 하는 핵심 비즈니스 로직이 된다.
또한 부가적인 관점은 핵심 로직을 실행하기 위해서 행해지는 데이터베이스 연결, 로깅, 파일 입출력 등이다.
즉, 기존에 OOP에서 바라보던 관점을 다르게 하여 부가기능적인 측면에서 보았을때 공통된 요소를 추출한 것을 의미한다.
OOP : 비지니스 로직의 모듈화
모듈화의 핵심 단위는 비지니스 로직
AOP : 인프라 혹은 부가기능의 모듈화
대표적 예 : 로깅, 트랜잭션, 보안 등
각각의 모듈들의 주 목적 외에 필요한 부가적인 기능들
OOP와 AOP는 공통된 기능을 재사용하는 기법이다.
OOP는 공통된 기능을 재사용하는 방법으로 상속이나 위임을 사용하며,
AOP는 분리한 부가기능을 에스펙트(Aspect)라는 독특한 모듈형태로 만들어서 사용한다.
상속이나 위임으로 핵심기능에서 부가기능을 분리된 모듈로 작성하기 어려운 OOP의 문제점을
AOP가 부가기능을 애스펙트(Aspect)로 정의하여, 핵심기능에서 부가기능을 분리함으로써
핵심기능을 설계하고 구현할 때 객체 지향적인 가치를 지킬수 있도록 도와주는 개념이다.
핵심 기능과 부가기능
횡단(공통) 관심 사항(cross-cutting concern) : 공통 기능의 코드
예) 로깅, 트랜잭션 처리
핵심 관심 사항 (core concern) : 핵심 기능의 코드
주요용어
1. 타겟(Target)
핵심 기능이 구현된 객체로 공통기능의 적용대상이 되는 객체를 의미한다.
2. 조인 포인트(JoinPoint)
Target이 가진 메서드를 의미하여 조인 포인트 중에서 포인트 컷이 선택한다.
3. 포인트 컷(PointCut)
Target이 가진 메서드가 조인포인트라면 포인트 컷은 필터링된 조인 포인트를 의미한다.
트랜잭션을 처리하는 공통 기능을 만들었다고 하면 이 횡단 관심 기능은 등록,수정,삭제 기능의 비즈니스 메서드에 대해서는 당연히 동작해야 하지만, 검색 기능의 메소드에 대해서는 트랜잭션과 무관하므로 동작할 필요가 없다.
이렇게 수많은 비즈니스 메소드 중에서 우리가 원하는 특정 메서드에서만 횡단 관심에 해당하는 공통 기능을 수행시키기 위해서 포인트 컷이 필요하다.
포인트 컷을 이용하면 메서드가 포함된 클래스와 패키지는 물론이고 메서드 시그니처까지 정확하게 지정할 수 있다.
포인트 컷 표현식
expression="execution( com.json.jsonroot.,impl.get*(..))"/>
com.json.jsonroot.. Impl . get(..)
리턴타입 패키지 경로 클래스 명 메서드 명 및 매개변수
com.json.jsonroot패키지로 시작하는 클래스 중에서 Impl로 끝나는 클래스의 get으로 시작하는 모든 메서드만 pointcut으로 설정한다.
4. 어드바이스 (Advice)
횡단 관심에 해당하는 공통 기능의 코드를 의미한다.
독립된 클래스의 메서드로 작성된다.
어드바이스로 구현된 메서드가 언제 동작할지 스프링 설정 파일을 통해서 지정할 수 있다.
동작 시점
5. 위빙(Weaving)
위빙은 포인트 컷으로 지정한 핵심 관심 메서드가 호출될 때
어드바이스에 해당하는 횡단 관심 메서드가 삽입되는 과정을 의미한다.
이 위빙을 통해서 비즈니스 메서드를 수정하지 않고도 횡단 관심에 해당하는 기능을 추가하거나 변경할 수 있다.
방식 : 컴파일 타임 위빙, 로딩 타임 위빙, 런타임 위빙
6. 애스팩트(Aspect) 또는 어드바이저(Advisor)
여러 객체에 공통으로 적용되는 기능을 분리하여 작성한 클래스이다.
AOP의 핵심은 Aspect이다. 이것은 포인트 컷과 어드바이스의 결합으로 어떤 포인트 컷 메서드에 대해서
어떤 어드바이스를 실행할지 결정한다. 이 에스캑트 설정에 따라 AOP의 동작 방식이 결정된다.
참고