티스토리 뷰
Spring AOP
[Spring]AOP - 프록시 패턴(Proxy Pattern) & 스프링 AOP
이전 글에서 스프링 프레임워크의 네 가지 특징과 AOP에 대해 살펴봤었다.
관련 글: https://gnidinger.tistory.com/450
다시 불러오자면 AOP(관심 지향 프로그래밍)는 OOP(Object Oriented Programming)를 구현(보완)하는 방식으로,
관심사(기능)의 분리를 통해 문제를 해결하는 패러다임이다.
구체적으로는 공통 관심사항(Cross-Cutting Concern, Aspect, 부가 기능, 횡단 관심사라고도 불림)과
핵심 관심사항(Core Concern, 핵심 기능)을 분리해
흩어진 횡단 관심사항을 Aspect로 모듈화*, 재사용성을 높이고 핵심 기능 개발에 집중하는 패러다임이라고 볼 수 있다.
*모듈화 - 공통된 로직이나 기능을 하나의 단위로 묶는 것
위의 그림을 조금 다른 관점에서 보면 아래와 같이 될 수도 있다.
여기서 공통 관심사항이란 그림에서도 보듯이 로깅, 보안, 트랜잭션 등 앱 전반에 공통으로 사용되는 기능을 말하는데,
핵심 기능을 보조하기 위해 사용되며, 단독이 아닌 핵심기능과 함께 사용되는 기능이다.
즉 필수적이지만 핵심적이지 않아 반복해 나타나는 코드이며, 이 코드의 리팩터링이 AOP의 핵심이라 볼 수도 있다.
트랜잭션에 대해선 아래 글에서 설명했다.
https://gnidinger.tistory.com/444
OOP에서는 공통적인 기능을 각 객체의 횡단으로 입력했다면, AOP는 공통적인 기능을 종단 간으로 삽입해
관점별로 외부에서 접근할 수 있게 했는데, 이는 OOP의 한계를 극복할 수 있게 도와준다.
만약 AOP, 즉 관심사의 분리가 없다면 비즈니스 클래스에 횡단 관심사와 핵심 관심사가 공존하게 된다. 이는
- 메서드의 복잡도를 증가시켜 코드 파악과 수정을 어렵게 만들고,
- 부가기능 메서드의 반복적 구현으로 인해 횡단 관심사의 모듈화를 어렵게 만든다.
따라서 이를 뒤집으면 AOP의 장점이 되는데,
- 중복되는 코드 제거
- 재활용성의 극대화
- 변화,수용의 용이성
이 그것이다.
계속해서 AOP에서 쓰이는 용어들에 대해 짚고 넘어가자.
- Aspect
- 흩어진 공통 관심사항을 모듈화 한 것
- Aspect = (여러) Advice + (여러) Pointcut
- Target
- Aspect가 적용되는, 핵심 기능을 담고 있는 모듈(클래스, 메서드,...)
- 기본적으로 Adivce를 받는 객체이며 포인트 컷으로 결정
- Join Point
- Advice가 적용되는 위치, 혹은 AOP를 적용할 수 있는 모든 지점
- 클래스 초기화, 객체 인스턴스화, 메서드 호출, 필드 접근, 예외 발생과 같은 애플리케이션 실행 흐름에서의 특정 포인트
- 공통 관심사항은 조인 포인트 전/후로 AOP에 의해 자동으로 추가됨
- 스프링 AOP는 프록시 방식을 사용하기 때문에 조인 포인트는 항상 메서드 실행 지점으로 제한됨
- Advice의 적용이 필요한 곳은 앱 내에 메서드를 갖는다.
- Pointcut
- Join Point의 상세한 스펙 정의
- 'A 메서드의 진입 시점에 호출할 것'과 같이 구체적으로 Advice가 실행될 지점을 정할 수 있음
- AspectJ 표현식을 사용해서 지정
- 프록시를 사용하는 스프링 AOP는 메서드 실행 지점만 포인트 컷으로 선별 가능
- Advice
- Join Point에서 수행되는 코드, 실질적인 부가기능을 담은 구현체
- Aspect를 언제 핵심 코드에 적용할지 정의
- 시스템 전체 Aspect에 API 호출 제공
- 상세 정보와 모든 메서드를 로그로 남기기 위해 메서드 시작 전의 조인 포인트 S를 선택
- Weaving
- Pointcut으로 결정한 Target의 Join Point에 Advice를 적용하는 것 - Advice를 핵심 코드에 적용
- 구체적으로는 Aspect를 Target 객체에 제공하여 새로운 프록시 객체를 생성하는 과정
- 핵심 기능 코드에 영향을 주지 않으면서 부가 기능을 추가할 수 있음
- 스프링 AOP에서는 프록시 객체를 생성하는 것 까지가 위빙
- AOP 프록시(Proxy)
- 해당 객체에 Advice가 적용된 후 생성된 객체
- AOP 기능을 구현하기 위해 만든 프록시 객체
- 스프링에서 AOP 프록시는 JDK 동적 프록시 또는 CGLIB 프록시
- Advisor
- 하나의 Advice와 하나의 Pointcut으로 구성
- 스프링 AOP에서만 사용되는 개념
마지막으로 스프링 AOP의 특징에 대해 살펴보고 글을 마치자.
- 스프링 빈에만 AOP를 적용 가능
- 프록시 패턴 기반의 AOP 구현체인 프록시 객체를 쓰는 이유는 접근 제어 및 부가기능 추가를 위해
- 모든 AOP 기능을 제공하는 것이 아닌 스프링 IoC와 연동하여 가장 흔한 문제(중복코드, 프록시 클래스 작성의 번거로움, 객체들 간 관계 복잡도 증가 ...)에 대한 해결책을 지원하는 것이 목적
'Java+Spring > Spring' 카테고리의 다른 글
[Spring]AOP - JDK Dynamic Proxy, CGLib (2) | 2022.08.18 |
---|---|
[Spring]AOP - AspectJ, Pointcut Expression, Join Point (2) | 2022.08.17 |
[Spring]AOP - 프록시 패턴(Proxy Pattern) & 스프링 AOP (0) | 2022.08.17 |
[Spring]Spring DI(Dependency Injection) (0) | 2022.08.12 |
[Spring]DI - @Component, @Configuration, @Bean, 스프링 컨테이너 구성 (0) | 2022.08.12 |
[Spring]DI - 빈 스코프(Bean Scope), 싱글톤 컨테이너 (2) | 2022.08.12 |
- Total
- Today
- Yesterday
- 지지
- 남미
- 기술면접
- java
- 칼이사
- 동적계획법
- 스트림
- 파이썬
- 야경
- 중남미
- 세계여행
- 여행
- 유럽여행
- 세계일주
- 리스트
- 알고리즘
- 세모
- Algorithm
- 맛집
- 자바
- 스프링
- spring
- BOJ
- Python
- 면접 준비
- 유럽
- 백준
- Backjoon
- RX100M5
- a6000
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |