1. 서론(AOP가 어떻게 부가기능의 단점을 해결했을까?)
애플리케이션 로직은 두가지의 기능으로 구성되어 있다.
- 핵심 기능
- 애플리케이션에서 단독으로 사용할 수 있고 애플리케이션에서 필수로 하는 기능등이 이에 해당한다.
- ex) 아카이브나 업무 로직을 포함하는 경우가 핵심 기능에 해당한다.
- 부가 기능
- 단독으로 사용할 수 없는 기능을 부가 기능이라고 부르고 핵심 기능에 함께 사용하는 기능을 부가 기능이라 한다.
- ex) 로그 추적, 트랜잭션 기능 등이 부가 기능에 해당한다.
부가 기능의 단점
- 하나의 부가 기능이 여러 핵심 기능에서 사용된다할 때 여러번 코드 반복의 문제가 있다.
- 여러 곳에서 사용될 때 유지보수가 어렵다는 단점이 있다.
- 위의 단점으로 aop를 적용시켜 해당 부가 기능의 단점을 해결하고자 한다.
2. AOP(AOP는 어떻게 부가 기능의 단점을 해결했을까?)
핵심 기능에 붙어 있던 부가 기능을 하나로 떨어뜨려서 단독으로 떨어진 부가 기능을 핵심기능에서 사용할 수 있게 했다.
기존 구성
- 기존의 경우라면 부가 기능을 핵심 기능에 같이 사용하는 식의 구성이었다.
기능 분리 후
3. @Aspect와 AOP?
AOP
- 부가기능과 핵심기능의 분리
- 해당 부가 기능을 어디에 적용할지 정의
- Advisor = Advice + Pointcut
- @Aspect 역시 위의 역할을 제공하고 있기 때문에 AOP라고 할 수 있다.
- spring에서 제공하는 aop
AOP와 OOP
- AOP의 경우엔 OOP의 보조 목적으로 등장했다
- OOP의 대체 목적이 아님
- 횡단 관심사를 처리하기 위해서 등장했다. (OOP의 경우 횡단 관심사 처리가 어려움)
- OOP의 경우 횡단 관심사 처리를 하려면 객체지향적이지 못하게 되기 때문에 이를 위해서 등장한 개념이 AOP이다.
AOP 적용 방식
- 컴파일 시점
- 컴파일러가 따로 필요하다는 단점이 있다.
- 또한 AspectJ를 사용해야한다.
- 클래스 로딩 시점
- 클래스 로더기 조작이 필요하다는 단점이 있다.
- 또한 AspectJ를 사용해야한다.
- 런타임 시점
- 프록시를 사용한 경우엔 메소드에 한정된 경우에만 Joinpoint가 적용 위치로 사용된다
- 메소드에 한정된 사용 위치에도 대부분의 실무는 이정도 범위에서 해결이 된다.
- 스프링의 경우엔 AspectJ에서 사용되는 것들을 차용해서 일부만 사용할 수 있게 했다 그렇기에 spring에서 aop를 적용한다면 메소드에 한정된 위치에서 사용한다고 생각해야한다.
4. AOP 용어
- Joinpoint
- advice가 적용될수 있는 위치
- 원래는 다양하게 존재한다. (메소드 실행, 생성자호출 static 메소드 접근 등..)
- spring의 경우엔 메소드 실행에만 join point가 존재한다.
- target
- 어드바이스를 받는 객체, 포인트컷으로 결정된다.
- Aspect
- advisor의 모듈을 모아 놓은 것을 의미한다.
- advisor의 모듈화
- advice + pointcut
- advisor
- 하나의 어드바이스와 하나의 포인트컷으로 구성된 것을 어드바이저라고 한다.
- 스프링 AOP에서만 사용되는 특별 용어이다.
- advice
- 부가 기능
- 특정 조인 포인트에서 Aspect에 의해 취해지는 조취
- Advice 종류
- Around
- Before
- After
- Pointcut
- 조인 포인트 중에서 어드바이스 적용 위치를 선별하는 기능
- 프록시를 사용하는 스프링 aop의 경우엔 메소드 실행 지점만 포인트컷 선별 가능
- AspectJ 표현식을 사용해서 지정
'Back-End > Spring' 카테고리의 다른 글
스프링 - @Aspect AOP(부제: 스프링 내에서 프록시 적용을 쉽게 해주는 @Aspect ) (0) | 2023.03.17 |
---|---|
[Spring DB][자바 예외] - 체크, 언체크 예외의 활용 그리고 예외 포함 스택 트레이스 (0) | 2022.07.20 |
[Spring DB][자바 예외] - 자바의 예외 이해 (0) | 2022.07.12 |
[Spring DB][커넥션풀과 데이터소스 이해] - DataSource의 이해 (0) | 2022.06.24 |
[Spring DB][커넥션풀과 데이터소스 이해] - 커넥션풀과 데이터소스란 무엇인가? (0) | 2022.06.22 |