객체 지향 프로그래밍(OOP, Object Oriented Programming)은 말 그대로 객체를 지향하는 프로그래밍 방식이다. 객체 지향에서 말하는 객체란 프로그램 동작의 주체가 되는 요소를 의미한다. 이 객체는 실체가 명확한 것일 수도 있고, 무형의 개념일 수도 있지만, 모든 객체는 상태와 동작을 가진다.
OOP의 특징은 5가지가 있으며, 아래와 같다.
관점 지향 프로그래밍(AOP, Aspect Oriented Programming)은 하나의 소프트웨어가 하나의 OOP로 설계 및 프로그래밍 되었다면 이것을 각 기능별로 모듈화해서 분리 시키는 프로그래밍 방식이다. 이때, AOP는 OOP를 대신하는 새로운 개념이 아니라, 기존 OOP를 더욱 보완하고 확장하여 OOP를 OOP답게 사용할 수 있도록 도와주는 개념이다.
AOP 도입 전까지 OOP는 객체를 재사용함에도 불구하고 필수적으로 반복되는 코드를 없앨 수는 없었다. 그러나 AOP를 도입함으로써 기능을 비지니스 로직과 공통 모듈로 구분한 후에 개발자의 코드 밖에서 필요한 시점에 비지니스 로직에 삽입하여 실행되도록 한다.
- 핵심 관심(Core Concern): 각 서비스의 핵심 비즈니스 로직
- 횡단 관심(Crosscut Concern): 공통 모듈
위 그림처럼 입출금
, 이자계산
, 대출
이라는 비즈니스 로직을 처리할 때, 로깅
, 보안
, 트랜잭션
이라는 공통 모듈이 있다. AOP에서는 이 공통 모듈을 따로 빼내어 각 비즈니스 로직에 횡단으로 삽입해 주는 것이다.
이렇게 각 객체별로 처리했던 것을 각 관점별로 외부에서 접근하는 것이 AOP의 핵심이다. 즉, DI가 의존성(new)의 주입이라면, AOP는 기능(logic)의 주입이라 할 수 있다. AOP를 통해서 중복 코드 제거, 효율적인 유지 보수, 높은 생산성, 재활용성 극대화, 변화 수용 용이 등의 이점을 얻을 수 있다.
Advice: JointPoint에서 실행되어야 하는 코드, 횡단 관심, 공통 모듈에 해당한다. 언제, 어떤 공통 모듈 기능을 핵심 로직에 적용할 지를 정의(what)하고 있다.
JointPoint: Advice을 삽입할 시점(when)을 의미한다. 이 개념을 더 구체적으로 설명하자면 시점은 함수를 실행 전(Before), 실행 후(After), 반환 후(AfterReturning), 예외 발생 시(AfterThrowing), 실행 전과 후(Around)로 나뉜다.
PointCut: JointPoint의 부분 집합으로서 실제 Advice이 적용되는 JointPoint를 나타낸다. 즉, 어떤 클래스의 어떤 함수에 삽입될 건지 위치를 나타낸다.
Aspect: JoinPoint(when)와 PointCut(where)를 합친 것이다. 여러 객체에 공통으로 적용되는 기능으로, 일정한 패턴을 가지는 클래스에 Advice를 적용하도록 지원할 수 있는 것이다.
Proxy: 횡단 관심이 핵심 관심에서 직접 실행되지 않고 대리인(Proxy)을 생성해 실행한다.
Weaving: Aspect(when + where) + Advice(what), Weaving을 통해 지정된 객체를 새 Proxy 객체로 생성한다. 이 과정을 도와주는 것이 AOP 툴이 하는 역할이다.
Target: 실질적인 비지니스 로직을 구현하는 코드, 핵심 관점에 해당한다. Advice를 받을 대상이며, 객체로 비지니스 로직을 수행하는 클래스일 수도 있지만, Proxy 객체(Object)가 될 수도 있다.
본 글은 아래 링크를 기반으로 정리하였습니다.