: 관점(Aspect) 지향 프로그래밍
메소드나 객체의 기능을 핵심 관심사(Core Concern)와 공통 관심사(Cross-cutting Concern)로 나누어 프로그래밍하는 것
**“핵심 관심사”** : 각 객체가 가져야 할 본래의 기능
**“공통 관심사”** : 여러 객체에서 공통적으로 사용되는 코드
공통 관심사를 Aspect로 정의하고 Aspect로 적용할 메소드나 클래스에 Advice를 적용하여 공통 관심사와 핵심 관심사를 분리한다.
OOP(객체 지향 프로그래밍)를 보완한 것으로, 공통 기능을 개발자의 코드 밖에서 필요한 시점에 적용하는 프로그래밍 방법이다.
클래스 A에서는 주황, 파랑, 빨간색 블록으로 구성이 되어 있고 클래스 B에서는 빨강, 주황 블록으로 구성되어 있으며 클래스 C에서는 주황, 파랑 블록으로 구성되어 있습니다.
해당 색은 클래스 A, B, C에서 동일하게 사용되는 코드를 의미합니다.
예를 들어서 클래스 A에서 주황색 블록을 수정을 하게 되면 클래스 B, C에서도 수정을 해야 합니다. 이렇게 되면 유지보수 차원에서 모든 코드를 수정해야 하니 불편한 점이 있습니다. 그래서 Aspect X에서는 공통 관심사인 주황색 블록을 묶어서 모듈화를 시켜서 코드의 재 사용성과 유지 보수성을 강화하였습니다.
이렇듯, 관점 지향 프로그래밍에서는 소스코드에서 반복적으로 사용하는 코드를 하나로 묶어서 모듈화하여 재사용성과 유지 보수성을 높일 수 있는 강점을 가지고 있습니다.
용어 | 설명 |
---|---|
Aspect | - 공통적인 기능들을 모듈화 한 것 |
Target | - Aspect가 적용될 대상/ 메소드, 클래스 등 |
Join point | - Aspect가 적용될 수 있는 시점/ 메소드 실행 전, 후 등 |
Advice | - Aspect의 기능을 정의한 것/ 메서드의 실행 전, 후, 예외 처리 발생 시 실행되는 코드 |
Point cut | - Join point를 정의하는 표현식, Advice가 적용될 위치 결정 |
Weaving | - Point cut에 명시된 Join point에 Advice를 적용하는 과정 |
메서드 | 설명 |
---|---|
@Aspect | 해당 클래스를 Aspect로 사용하겠다는 것을 명시 |
@Before | 대상 “메서드”가 실행되기 전에 Advice를 실행 |
@AfterReturning | 대상 “메서드”가 정상적으로 실행되고 반환된 후에 Advice를 실행 |
@AfterThrowing | 대상 “메서드에서 예외가 발생”했을 때 Advice를 실행 |
@After | 대상 “메서드”가 실행된 후에 Advice를 실행 |
@Around | 대상 “메서드” 실행 전, 후 또는 예외 발생 시에 Advice를 실행 |
포인트컷을 이용하면 어드바이스 메소드가 적용될 비즈니스 메소드를 정확히 필터링할 수 있다.
포인트컷 표현식은 ‘execution’과 같은 포인트컷 지시자로 시작한다. 줄여서 PCD라고 한다.
작성중..
스프링 AOP의 동작방식을 이해하기 위해 반드시 알아둬야할 중요한 요소이다.
- 프록시 객체
프록시 객체는 객체 지향 프로그래밍에서 자주 사용되는 디자인 패턴 중 하나이다. 즉, 스프링에서만 사용되는 것이 아니라 이전부터 존재하던 개념이라고 볼 수 있다.
프록시 객체는 실제 객체의 대리인 역할을 수행하며, 실제 객체와 동일한 인터페이스를 구현한다. 따라서, 클라이언트에서 실제 객체를 호출하는 것처럼 보일지라도 실제로는 진짜 객체의 메소드를 프록시 객체가 대신 호출한다.
프록세 객체는 실제 객체의 대리인 역할을 수행하며, 실제 객체와 동일한 인터페이스를 구현한다. 따라서, 클라이언트에서 실제 객체를 호출하는 것처럼 보일지라도 실제로는 진짜 객체의 메소드를 프록시 객체가 대신 호출한다.
실제 객체와 같은 인터페이스를 구현하였더라도 실제 객체의 메소드를 호출할 때 추가적인 동작을 수행하도록 구현되는데, 이를 통해 타깃이 되는 실제 객체의 동작을 제어하거나 변경할 수 있다.
스프링 AOP를 사용하는 대표적인 적용 사례로는 선언적 트랜잭션 관리, 로깅, 보안 검사 등이 있다.
이 외에도, 스프링 AOP는 애플리케이션의 성능을 모니터링하거나, 예외 처리 로직을 공통화하는 등 다양한 방법으로 활용될 수 있다.
AOP를 통해 개발자는 공통 기능을 한 곳에 모듈화하여 관리할 수 있으며, 이는 비즈니스 로직과 공통 기능의 결합도를 낮추어 코드의 가독성과 재사용성을 높일 수 있다.
참고자료
https://velog.io/@kai6666/Spring-Spring-AOP-개념
https://engkimbs.tistory.com/entry/스프링AOP
https://adjh54.tistory.com/133
https://f-lab.kr/insight/understanding-and-applying-aop-in-programming
https://sjh836.tistory.com/157
https://hyeonmin.tistory.com/109