Spring AOP (Aspect-oriented Programming)
OOP를 보완하는 수단으로, 흩어진 Aspect를 모듈화 할 수 있는 프로그래밍 기법
흩어진 관심사 (Crosscutting Concerns)
Class A { Aspect X, Aspect Y, Aspect Z}
Class B { Aspect X, Aspect Y, Aspect Y}
Class C { Aspect X, Aspect Z}
각 클래스에서 중복된 관심사를 갖는 경우에 AOP를 적용하면
Aspect X {A,B,C}
Aspect Y {A,B}
Aspect Z {A,C}
다음과 같이 Aspect들로 모듈화 할 수 있다.
AOP 주요개념
- Aspect와 Target
- Advice(해야할 일들)
- Join point와 Pointcut(어디에 적용해야 할 지)
AOP 구현체
- 자바
- AspectJ
- 스프링 AOP
AOP 적용 방법
- 컴파일
- 로드 타임(Class는 이미 불러왔고, 이후 Aspect를 로드할 때)
- 런타임
스프링 AOP : 프록시 기반 AOP
스프링 AOP 특징
- 프록시 기반 AOP 구현체
- 스프링 빈에만 AOP를 적용할 수 있다.
- 모든 AOP 기능을 제공하는 것이 목적이 아니라, 스프링 IoC와 연동하여 엔터프라이즈 애플리케이션에서 가장 흔한 문제에 대한 해결책을 제공하는 것이 목적
프록시 패턴
- 기존 코드 변경없이 접근 제어 또는 부가 기능 추가
- proxy 객체가 target 객체를 참조하여 사용
문제점
- 매번 프록시 클래스를 작성해야 하는가?
- 여러 클래스, 여러 메소드를 적용하려면?
- 객체들 관계가 복잡하면?
문제점을 해결하기 위한 스프링 AOP
- 스프링 IoC 컨테이너가 제공하는 기반 시설과 동적 프록시(런타임간)를 사용하여 해결
- 동적 프록시 : 동적으로 프록시 객체를 생성하는 방법
- 자바가 제공하는 방법은 인터페이스 기반 프록시 생성
- 스프링 IoC: 기존 빈을 대체하는 동적 프록시 빈을 만들어 등록 시켜준다.
- 클라이언트 코드 변경 없음
- AbstractAutoProxyCreator implements BeanPostProcessor
- 자동으로 프록시 빈을 만들어줌
스프링 AOP: @AOP 어노테이션
애노테이션 기반의 스프링 AOP
의존성 추가
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
Aspect 정의
- @Aspect
- 빈으로 등록을 위한 @Component 추가
Pointcut 정의
- @Pointcut(표현식)
- 주요 표현식
- execution
- @annotaion
- bean
- 포인트컷 조합
- &&, ||, !
Advice 정의
- @Before // 메서드 시작 전
- @AfterReturning // 반환 후
- @AfterThrowing // 에러 후
- @Around // 메서드를 감쌈 -> 다용도로 사용가능
'Spring Boot > Core' 카테고리의 다른 글
Null-safety (0) | 2022.08.01 |
---|---|
SpEL (0) | 2022.07.30 |
데이터 바인딩 추상화 (0) | 2022.07.26 |
Validation 추상화 (0) | 2022.07.25 |
Resource 추상화 (0) | 2022.07.25 |
댓글