AOP - 관점 지향 프로그래밍
관점 지향 프로그래밍을 의미
- Aspect-Oriented Programming의 약자
- '횡단 관심사'를 분리하는 것에 목적 → 부가기능을 따로 관리하는 것
※ 횡단 관심사 - 애플리케이션에서 코드가 중복되고, 결합도가 높아 다른 로직과 분리할 수 없는 애플리케이션 로직 - 로깅, 보안, 트랜잭션 등
AOP 용어
- Pointcut - Aspect 적용 위치 지정자
- JoinPoint - 연결 가능한 지점
- Advice - 조언, 어떤 조인포인트에서 어떤(언제, 무엇을) 동작을 취할지에 대한 규칙 정의
- Aspect - Advisor의 집합체
- Advisor - 조언자, 어떤 조언을 적용할지를 결정하는 역할(어디서, 언제, 무엇을)
- Target - 부가기능을 부여할 대상
스프링 AOP - 로직 주입
스프링 DI가 의존성에 대한 주입이라면 스프링 AOP는 로직 주입
- @Aspect - 이 클래스를 AOP에서 사용하겠다.
- @Before - 대상 메서드 실행 전에 이 메서드를 실행하겠다.
- 스프링 AOP는 인터페이스(interface) 기반이다.
- 스프링 AOP는 프록시(proxy) 기반이다.
- 스프링 AOP는 런타임(runtime) 기반이다.
AOP 동작 과정
1. 대상 객체 생성:
- 스프링 컨테이너에게 AOP를 적용할 대상 객체(Target)와 해당 객체에 적용할 관점(Aspect)을 설정
- XML 파일, Java 설정 클래스 등을 통해 수행
2. 프록시 객체 생성:
- 스프링은 대상 객체를 감싸는 프록시 객체를 생성
- 프록시 객체는 대상 객체의 메소드 호출을 가로채서 관점에서 정의한 횡단 관심사를 수행할 수 있도록 함
3. 포인트컷 설정:
- 관점에서 적용할 조인 포인트(메소드 호출, 예외 발생 등)를 결정하는 포인트컷(Pointcut)을 설정
- 어떤 메소드에 어떤 어드바이스를 적용할지를 결정하는 역할
4. 어드바이스 적용:
- 스프링은 포인트컷에 의해 결정된 조인 포인트에 관점에서 정의한 어드바이스(Advice)를 적용
- 어드바이스는 조인 포인트에서 실행될 동작을 정의하며, 메소드 실행 전, 후, 예외 발생 시에 실행될 수 있음
5. 대상 객체 호출:
- 클라이언트가 대상 객체의 메소드를 호출하면, 프록시 객체가 해당 메소드 호출을 가로채고 관점에서 정의한 어드바이스를 실행
- 이때 어드바이스에 정의된 횡단 관심사가 수행
장단점
장점:
- 모듈성 향상 - 횡단 관심사(cross-cutting concern)를 모듈화하여 코드의 모듈성을 향상
ex) 로깅, 트랜잭션 관리, 보안 등과 같은 횡단 관심사를 별도의 모듈로 분리하여 코드 중복을 감소
- 유지보수성 향상: AOP는 횡단 관심사를 중앙 집중화하여 관리하기 때문에, 코드의 변경이 필요할 때 해당 관심사를 수정하는 것만으로 여러 모듈에 적용됨
단점:
-
오버헤드: AOP는 횡단 관심사를 중앙 집중화하여 처리하기 때문에, 런타임 시에 관점(Aspect)을 적용하는 데에 필요한 처리 시간이 증가할 수 있음
-
복잡성 증가: 각각의 모듈에 관련된 코드가 아니라 횡단 관심사와 관련된 코드가 분산되어 있을 수 있어 코드의 흐름을 이해하기 어려울 수 있음
PSA - 일관성 있는 서비스 추상화
- PSA (Portable Service Abstraction)
- 어댑터 패턴을 적용해 같은 일을 하는 다수의 기술을 공통의 인터페이스로 제어할 수 있게 한 것