관점 지향 프로그래밍 (AOP, Aspect oriented Programming)
관점 지향 프로그래밍 언어로 객체 지향 프로그래밍 뒤를 이은 하나의 프로그래밍 언어 고주
문제를 해결하기 위한 핵심 관심 사항과 전체에 적용되는 공통관심 사항을 기준으로 프로그래밍함으로
공통 모듈을 여러 코드에 쉽게 적용할 수 있도록 지원하는 기술
공통으로 사용하는 기능들을 모듈화하고 해당 기능을 프로그램 코드에서 직접 명시하지 않고 선언적으로 처리하여
필요한 컴포넌트에 계층적으로 다양한 기능들을 적용
CC(Core Concern)
- 주 관심사항(핵심 관심사항)
CCC(Corss Cutting Concern)
- 공통 관심사항(Logging, transaction 등)

위와 같이 흩어진 관심사를
Aspect로 모듈화하고 핵심적인 비즈니스 로직에서 분리하여 재사용하겠다는 것이 AOP의 취지다.
AOP 주요 개념
- Aspect : 위에서 설명한 흩어진 관심사를 모듈화 한 것. 주로 부가기능을 모듈화함.
- Target : Aspect를 적용하는 곳 (클래스, 메서드 .. )
- Advice : 실질적으로 어떤 일을 해야할 지에 대한 것, 실질적인 부가기능을 담은 구현체
- JointPoint : Advice가 적용될 위치, 끼어들 수 있는 지점. 메서드 진입 지점, 생성자 호출 시점, 필드에서 값을 꺼내올 때 등 다양한 시점에 적용가능
- PointCut : JointPoint의 상세한 스펙을 정의한 것. 'A란 메서드의 진입 시점에 호출할 것'과 같이 더욱 구체적으로 Advice가 실행될 지점을 정할 수 있음
스프링 AOP 특징
- 프록시 패턴 기반의 AOP 구현체, 프록시 객체를 쓰는 이유는 접근 제어 및 부가기능을 추가하기 위해서임
- 스프링 빈에만 AOP를 적용 가능
- 모든 AOP 기능을 제공하는 것이 아닌 스프링 IoC와 연동하여 엔터프라이즈 애플리케이션에서 가장 흔한 문제(중복코드, 프록시 클래스 작성의 번거로움, 객체들 간 관계 복잡도 증가 ...)에 대한 해결책을 지원하는 것이 목적
AOP 적용 전/후 의존관계

helloController는 memberService의 기능들을 사용하며 의존관계가 수립됩니다.
memberService 에서는 공통적인 기능들을 추가하려면 각각의 메서드마다 기능들을 추가/수정/삭제 해야합니다.

helloController와 memberService 간에 프록시 객체인 memberServiceProxy가 추가되었습니다.
helloController 는 이제 실제객체(Real Subject)에 바로 접근하지않고 프록시객체를 거쳐 프록시 객체에서 실제 객체에 접근하여 로직을 수행합니다.

Client가 Request를 하였을 때 스프링 컨테이너 내부의 의존관계를 보여줍니다.
helloController 가 memberService 에 메서드를 호출해 비즈니스 로직을 수행하고 memberService에서는 memberRepository 를 호출하여 레파지토리에서는 DB에 접근해 데이터를 조회/수정/삭제 합니다.
모두 실제객체에 바로바로 접근합니다.

모든 객체들에게 프록시객체가 생성되었고 의존관계도 프록시 객체를 통하여 이뤄집니다.
각각 객체의 기능들을 수행하려 메서드를 호출하면 요청을 프록시 객체가 전달받아서 전처리/후처리 등 추가적인 작업을 수행하면서 실제 객체(Real Subject)에 로직을 수행합니다.
'개발' 카테고리의 다른 글
587포트와 465포트의 차이점 (0) | 2023.01.11 |
---|---|
절차 지향 프로그래밍(Procedural Programming) (0) | 2022.12.04 |
인증(Authentication), 인가(Authorization) (0) | 2022.12.02 |
DB 트랜잭션(Transaction) (0) | 2022.11.30 |
HTTP 프로토콜 (0) | 2022.11.30 |
댓글