sanichdaniel의 iOS 개발 블로그
Aspect Oriented Programming 본문
실용주의 프로그래머 책을 읽다가 AOP라는 단어가 나와서 공부해보았다.
OOP, POP, FP는 들어봤어도 AOP
AOP를 번역하면 관점 지향 프로그래밍이다.
로직을 핵심적인 관점, 부가적인 관점으로 분리하고 그 관점을 기준으로 모듈화를 하겠다는 의미이다.
핵심적인 관점은 결국 우리가 적용하고자 하는 핵심 비즈니스 로직이 된다.
또한 부가적인 관점은 핵심 로직을 실행하기 위한 부가적인 코드로 다른말로는 흩어진 관심사라고 한다.
이 부가적인 코드들은 여러 곳에 횡적으로 흩어져 반복적으로 사용되고 있다.
iOS에서는 로깅, 데이터 저장, 캐싱 관련 코드가 있겠다.
위처럼 흩어진 관심사를 Aspect로 모듈화하고 핵심적인 비지니스 로직에서 분리하여 재사용하는것이 AOP이다.
AOP의 개념들
Joinpoint: Aspect를 어디에 넣어줄지 정의한다. 일반적인 joinpoint는 메서드 호출, 프로퍼티 접근하는곳이다.
Pointcut: 어떻게 Aspect를 joinpoints에 넣어줄지 결정한다.
Advice: pointcut에 넣어지는 부가적인 코드
Weaving: 최종적으로 비지니스 코드와 부가적인 코드가 합쳐질지를 정의한다. AOP란 컴파일 타임 또는 런타임에 코드를 생성하는 것입니다.
swift에서 프로퍼티 래퍼를 활용하여 AOP를 구현한 예제
- OOP : 비지니스 로직의 모듈화
- 모듈화의 핵심 단위는 비지니스 로직
- AOP : 인프라 혹은 부가기능의 모듈화
- 대표적 예 : 로깅, 트랜잭션, 보안 등
- 각각의 모듈들의 주 목적 외에 필요한 부가적인 기능들
Spring에서 AOP는 Proxy 패턴을 구현된다.
외부에서 특정한 객체를 호출하면, 객체를 감싸고 있는 바깥쪽 객체(Proxy)를 통해서 호출이 되는 방식이다.
swift는 statically typed language로 메소드 호출을 C++처럼 static/vtable 방식으로 호출한다. 따라서 컴파일 타임에 이를 지원해야 하지만, 안타깝게도 swift 컴파일러는 이를 지원하지 않고 서드파티에서 개발된 관련된 도구도 없음으로 아직 컴파일 타임에 AOP를 사용 할 수 없다.
하지만 Objective-C는 messaging 방식(dynamic dispatch, late binding)으로 메서드 호출을 구현했다.
static/vtable 방식의 dispatch는 컴파일 타입 인터셉션만 가능하다.
메시징 스타일은 런타임 인터셉션도 가능하다.
UIKit은 objective-c를 이용하여 작성되었기에, 구글 애널리틱스는 viewWillAppear 호출을 인터셉트해서 로깅을 할 수 있다.
출처
medium.com/genetec-tech/swift-an-aspect-oriented-programming-language-6058b07c1205
https://develogs.tistory.com/20