AOP란?
Aspect Oriented Programing의 약자로 관점 지향 프로그래밍을 의미한다.
AOP와 관련된 용어들은 다음과 같다.
- 조인포인트(JoinPoint)
- 클라이언트가 호출한 모든 비즈니스 메소드를 조인포인트라고 하며, 포인트컷 대상 혹은 포인트 컷 후보라고 하는데 이는 조인포인트에서 포인트컷이 선택되기 때문이다.
- 포인트컷(PointCut)
- 필터링 된 조인포인트를 의미한다.
- 어드바이스(Advice)
- 어드바이스는 횡단관심에 해당하는 공통 기능의 코드를 의미하며, 독립된 클래스의 메소드로 작성된다. before, after, after-returning, after-throwing, around 등 다섯 가지의 구체적인 동작시점이 있다.
- 위빙(Weaving)
- 포인트컷으로 지정한 핵심 관심 메소드가 호출될 때, 어드바이스에 해당하는 횡단 관심 메소드가 삽입되는 과정을 의미한다.
- 애스펙트(Aspect) 또는 어드바이저(Advisor)
- 애스펙트는 포인트컷과 어드바이스의 결합으로써 어떤 포인트컷에 어떤 어드바이스를 실행할지 결정한다. 이 애스펙트 설정에 따라 AOP 동작방식이 결정되므로 가장 중요한 개념이라고 할 수 있다.
포인트컷 표현식
execution(* com.OA.wip.*Impl.get*(..))
* : 리턴타입
com.OA.wip : 패키지 경로
*Impl : 클래스명
get*(..) : 메소드명 및 매개변수
리턴타입
* | 모든 리턴타입 허용 |
void | 리턴타입이 void인 메소드 |
!void | 리턴타입이 void가 아닌 메소드 |
패키지지정
com.springbook.biz | 정확하게 com.springbook.biz 패키지만 선택 |
com.springbook.biz.. | com.springbook.biz 패키지로 시작하는 모든 패키지 선택 |
com.springbook..impl | com.springbook.biz 패키지로 시작하면서 패키지 이름이 Impl로 끝나는 패키지 선택 |
클래스 지정
BoardServiceImpl | 정확하게 BoardServiceImpl 클래스만 선택 |
*Impl | 클래스이름이 Impl로 끝나는 클래스만 선택 |
BoardServiceImpl+ | 클래스 이름 뒤에 +가 붙으면 해당 클래스로부터 파생된 모든 클래스, 인터페이스의 경우 해당 인터페이스를 구현한 모든 클래스 선택 |
메소드 지정
*(..) | 모든 메소드 선택 |
get*(..) | 메소드 이름이 get으로 시작하는 모든 메소드 선택 |
매개변수 지정
(..) | 매개변수의 타입과 개수 제한이 없음 |
(*) | 반드시 1개의 매개변수를 가지는 메소드만 선택 |
(com.springbook.user.UserVO) | 매개변수로 UserVO를 가지는 메소드만 선택 |
(!com.springbook.user.UserVO) | 매개변수로 UserVO를 가지지 않는 메소드만 선택 |
(Integer, ..) | 1개 이상의 매개변수를 가지되, 첫 번째 매개변수의 타입이 Integer인 메소드만 선택 |
(Integer, *) | 반드시 2개이상의 매개변수를 가지되, 첫 번째 매개변수의 타입이 Integer인 메소드만 선택 |
어드바이스 동작시점
Before | 비즈니스 메소드 실행 전 동작 |
After | - After Returning : 비즈니스 메소드가 성공적으로 리턴되면 동작 - After Throwing : 비즈니스 메소드 실행 중 예외가 발생하면 동작(try ~ catch 블록에서 catch에 해당) - After : 비즈니스 메소드가 실행 후 반드시 실행(try ~ catch ~ finally 블록에서 finally에 해당) |
Around | Around는 비즈니스 메소드 호출을 가로채 호출 전후에 해당되는 로직을 작성할 수 있음 |
참조
- 스프링 퀵 스타트
'Spring' 카테고리의 다른 글
Spring log4j 라이브러리란? (0) | 2021.03.25 |
---|---|
Springframework version 마이그레이션하는 방법 (0) | 2021.03.25 |
SELECT 문으로 데이터 랜덤으로 가져올 경우에 대한 성능 테스트 (0) | 2020.12.05 |
Mybatis에서 대량의 데이터를 넣을 때 bulk insert를 사용하자 (0) | 2020.12.05 |
멀티 스레드 환경에서 동일 데이터에 대해서 업데이트 시 고려해야 할 사항 (0) | 2020.12.05 |