AOP(Aspect Oriented Programming)
소프트웨어에서 공통적인 관심사를 모듈화하고 분리하는 프로그래밍 방식.
개발을 하다 보면 특정 서비스나 도메인에 종속되지 않고, 여러 서비스에서 공통적으로 사용되는 기능이 존재한다. 예를 들어 트랜잭션, 로깅, API 사용자 권한 검증 같은 작업은 특정 서비스의 핵심 내용과 관련이 없으며, 프로그램 전역에서 공통적으로 사용된다. 이들은 핵심적인 서비스를 구현하기 위해 필요한 부수적인 기능을 수행한다.
이처럼 특정 모듈에 종속되는 대신 여러 모듈에서 공통적으로 사용될 수 있는 프로그램 상 특정 측면(Aspect)을 횡단 관심사(Cross-cutting concern)라고 부른다.
전통적인 객체지향 프로그래밍 방식에서는 서비스의 핵심과 횡단 관심사가 코드 상에 섞여 있어, 이를 관리하는데 어려움이 있었다. 예를 들어 100개의 서비스가 있다면 서비스에서 사용되는 횡단 관심사인 트랜잭션 / 로깅 관련 코드도 100군데에 중복되어 존재하게 된다. 만약 횡단 관심사 자체에 변경이 발생하면 100군데에 중복되어 있는 코드를 찾아 수정해야 하는 불상사가 발생하는데, 이는 여러 영역에 동일한 역할의 코드가 중복되어 있기 때문이다.
따라서 프로그램 상 여러 위치에 중복되어 표현된 횡단 관심사 코드를 서비스로부터 분리, 모듈화하여 한 곳에서 관리하는 개발 방식이 등장하게 되는데, 이것이 AOP다. AOP는 횡단 관심사를 모듈화하여 한 군데에서 관리하므로 유지보수에 큰 도움을 준다. 개발자 입장에서는 보일러 플레이트에 가까운 공통 기능 관련 코드를 작성하지 않아도 되므로, 서비스의 핵심 비즈니스 로직에 집중할 수 있게 된다.
AOP는 여러 도메인에서 사용되는 트랜잭션 처리나 로깅 같은 공통된 관심사를 “관점(Aspect)”라는 표현을 통해 정의하고, 이를 어플리케이션 여러 부분에서 사용할 수 있다.
언어 구현마다 다를 수 있지만, 데코레이터, 메타 정보 + 컴파일 등의 방법을 통해 원 객체나 메서드를 변경하지 않고 기능을 추가함으로써 AOP를 달성할 수 있다.
용어 정리
아래 용어들은 주로 스프링 진영에서 AOP를 달성하는 과정에 사용된다. 다른 언어 또는 프레임워크에서는 다른 방법으로 AOP를 달성할 수 있다.
용어 | 설명 |
Aspect (관점) |
어플리케이션 상에 독립적으로 존재하는 관심사(ex 트랜잭션 관리) |
Join Point (결합점) |
어플리케이션 실행 중 특정한 지점(예외 처리, 필드 접근, 메서드 실행 등) |
Advice | 특정 결합점에서 관점에 맞게 처리되는 작업 종류 1. Before: 작업 이전 2. After: 작업 이후 3. Around: 작업 이전과 이후 모두 |
PointCut | 어디에 관점을 적용할지를 정하는 필터링 로직. 일치하는 Join Point를 필터링하고, 해당 지점에 관점을 적용한다. |
Weaving | 관점을 어플리케이션 코드에 적용하는 과정. 여러 방법이 있다. 1. 컴파일 타임에 코드를 삽입 ( 메타 정보 + 컴파일 등 ) 2. 런타임에 객체를 연결 ( 데코레이터 등 ) |
더 쉽게 표현해보면?
- Aspect: 우리가 분리하기를 원하는 공통 로직을 추상화한 개념 ( 트랜잭션 처리 )
- Join Point: 공통 로직을 적용할 수 있는 지점 또는 대상 ( 메서드 등 )
- Advice: 관점에 따른 로직을 구현해 둔 구현체 (메서드 앞·뒤로 트랜잭션 메서드 실행)
- PointCut: 관점을 적용할 위치(Join Point)를 나타내는 표현식(regex와 유사한 개념)
AOP는 시스템 내 공통적으로 사용되는, “부가 기능”에 해당하는 관심사를 주요 서비스의 로직으로부터 분리하여 모듈화한다. 개발을 피곤하게 하는 로깅, 트랜잭션 처리와 같은 중복된 동작을 별도로 분리하여 관리함으로써, 개발자가 핵심 비즈니스 로직 구현에 집중할 수 있도록 하는것이 목적이라고 볼 수 있다.
- 개발자는 비즈니스 로직에 집중하고, 부가 기능은 데코레이터, 어노테이션 등 간단한 방법으로 추가하여 적용한다.
- 부수적 기능(cross-concern)을 비즈니스 로직과 분리하여 모듈화한다. 이를 통해 관심사를 한 군데에서 관리할 수 있으므로 유지보수에 도움이 된다.
AOP는 횡단 관심사를 모듈화하고, 이를 필요한 위치에 적용할 수만 있다면 어떤 방법도 사용할 수 있다. 메타 데이터를 기반으로 컴파일 타임에 코드를 삽입하는 방식도 괜찮고, 데코레이터 / 프록시 등 언어 차원에서 지원하는 런타임 바인딩도 상관 없다. 횡단 관심사의 모듈화가 AOP의 핵심임을 명심하자.
'CS' 카테고리의 다른 글
sync / async & blocking / non-blocking (0) | 2024.09.20 |
---|---|
객체 지향 프로그래밍의 배경 (1) | 2024.02.19 |
[CS] DIP / IoC / DI (0) | 2023.10.23 |
[CS] 객체 지향 (0) | 2023.10.18 |
[batch] cron 표현식 (0) | 2023.08.23 |