기본 개념
- 핵심 기능 : 업무 로직 포함하는 기능 ( 업무 관련 코드 )
- 부가 기능 : 핵심 기능을 돕는 부가 기능 ( 트랜잭션, 보안, 로깅코드 등 = 횡단 관심사 ) (공통 기능)
- Aspect : 부가 기능을 정의한 코드 (advice) + 적용할 위치를 결정하는 (PointCut)을 합친 기능이다.
주요 개념
- Spring MVC 구조
- @Controller
- @Service
- @Repository
- Spring MVC 구조와 같이 관심사 별로 계층을 나눠서 객체를 관리한다 이를 관심사의 분리, 모듈화라고 부른다.
AOP 란!?
(Aspect-Oriented Programming)은 기존과 다른 프로그램 구조 사고 방식으로 객체 지향 프로그래밍의 부족한 부분을 보완한다. 핵심기능과 부가 기능을 분리함 으로써 변경 지점이 하나가 될 수 있도록 모듈화 시키는 것 (불필요한 반복 제거)
- OOP의 모듈화의 핵심 단위는 클래스
- AOP의 모듈화의 핵심 단위는 관점
따라서 AOP Aspect는 여러 유형과 객체 간에 발생하는 문제 (ex - 트랜잭션)의 모듈화를 가능하게 한다.
AOP 용어 설명
Aspect
- 여러 객체에 공통으로 적용 되는 기능 ( 공통 기능)
- advice + pointcut 을 모듈화하여 어플리케이션에 포함되는 횡단 기능
- 여러개의 advice와 pointcut이 함께 존재한다.
join point
- 애플리케이션에 새 동작을 추가하기위해 조인 포인트에 aspect code를 추가할 수 있다.
- 스프링 AOP는 프록시 방식을 사용하므로 조인포인트는 항상 메서드 실행 지점으로 제한된다.
- join point란 AOP를 적용할 수 있는 지점을 말한다.
Advice
- 특정 조인 포인트에서 수행되는 코드를 의미
- Aspect를 언제 핵심 코드에 적용할지 정의
- 시스템 전체 Aspect에 API 호출을 제공
- 메서드 호출 전 로그(상세 정보, 모든 메서드의 로그)를 남기기 위해 메서드 시작전 포인트 S를 선택
- (부가 기능)
pointcut
- 조인 포인트 중에서 어드바이스가 적용될 위치 결정
- Aspect 표현식을 이용
- 프록시를 사용하는 스프링 AOP는 메서드 실행 지점만 포인트컷으로 선별 가능
Weaving
- 포인트 컷으로 결정한 타겟(조인 포인트)에 advice를 핵심 코드에 적용
- 핵심 기능 코드와 무관하게 부가 기능 추가할 수 있음
- AOP 적용을 위해 Aspect 객체에 연결한 상태
- 컴파일 타임
- 로드 타임
- 런타임, 스프링 AOP 런타임, 프록시 방식
AOP proxy
- AOP 기능을 구현하기 위해 만든 프록시 객체
- 스프링에서의 AOP 프록시는 CGLIB 프록시 or JDK 동적 프록시다.
Target
- 핵심 기능을 담고 있는 모듈이고, 타겟은 부가기능을 부여할 대상이 된다.
- advice를 받는 객체이며, 포인트 컷으로 결정된다.
Advisor
- 하나의 어드바이스와 포인트 컷으로 구성된다.
Advice
- 어드바이스는 순서를 보장하지 않는다.
- Aspect를 별도의 클래스로 분리해야 한다.
Advice 종류
- Before
- 조인 포인트 실행 이전에 실행된다.
- 타겟 메서드가 실행되기 전에 처리할 부가기능을 호출 하기 전 공통 기능을 실행한다.
- Before Advice 구현한 메서드는 일반적으로 리턴타입이 void이다.
- 예외 발생시 메서드가 호출되지 않는다.
- After returning
- 조인 포인트가 정상 완료 후 실행된다.
- 메서드가 예외 없이 실행된 이후에 공통 기능을 실행한다.
- After throwing
- 메서드가 예외를 던지는 경우 실행
- 메서드가 실행하는 도중에 예외가 발생한 경우 공통기능 실행
- After (finally)
- 조인 포인트의 동작과 관계없이 실행
- 예외 동작의 finally
- 메서드 실행 후 공통기능 실행
- 리소스를 해제하는데 사용
- 조인 포인트의 동작과 관계없이 실행
- Around
- 메서드 호출 전후에 수행하며 가장 강력한 어드바이스
- 조인 포인트 실행 여부 선택 - joinPoint.proceed()
- 전달 값 변환 - joinPoint.proceed(args[])
- 반환 값 변환
- 예외 변환
- Try ~ catch ~ finally 가 들어가는 구문 처리 가능
- 메서드 실행 전, 실행 후, 예외 발생 시점에 공통 기능을 실행한다.
- proceed()를 통해 대상을 실행하고, 여러번 실행할 수 있다.
- 메서드 호출 전후에 수행하며 가장 강력한 어드바이스
Pointcut 표현식
- 포인트 컷은 관심 조인 포인트를 결정해서 advice가 실행되는 시기를 결정할 수 있다.
- 포인트 컷 지시자 : executuon
- 메서드 실행 조인트 포인트를 매칭한다.
- 스프링 AOP에서 가장 많이 사용하고, 기능이 복잡하다.
JoinPoint
- AOP는 메서드 실행 위치뿐만 아니라 다양한 위치에도 적용이 가능하다.
- 생성자, 필드 값 접근, static 메서드 접근, 메서드 실행
- AOP를 수행하는 메서드는 JoinPoint 인스턴스를 인자로 받게된다.
- JoinPoint 인스턴스에서 조인 포인트 지점의 정보를 얻어내야 한다.
인터페이스 주요기능
- JoinPoint.getArgs() : JoinPoint에 전달된 인자를 배열로 반환합니다.
- JoinPoint.getThis() : AOP 프록시 객체를 반환합니다.
- JoinPoint.getTarget() : AOP가 적용된 대상 객체를 반환합니다.
- 클라이언트가 호출한 비즈니스 메소드를 포함하는 비즈니스 객체를 반환합니다.
- JoinPoint.getSignature() : 조언되는 메서드에 대한 설명을 반환합니다.
- 클라이언트가 호출한 메소드의 시그니처(리턴타입, 이름, 매개변수) 정보가 저장된 Signature 객체를 반환합니다
- Signature
- 객체가 선언하는 모든 연산은 연산의 이름, 매개변수로 받아들이는 객체들을 시그니처라고 합니다.
- Signature가 제공하는 메서드
- String getName() : 클라이언트가 호출한 메소드의 이름을 반환합니다.
- String toLongString() : 클라리언트가 호출한 메소드의 리턴타입, 이름, 매개변수를 패키지 경로까지 포함해서 반환합니다.
- String toShortString() : 클라이언트가 호출한 메소드 시그니처를 축약한 문자열로 반환합니다.
- JoinPoint.toString() : 조언되는 방법에 대한 유용한 설명을 인쇄합니다.
'IT 정보 > Spring' 카테고리의 다른 글
[Spring] Spring MVC - API 계층 (6) | 2022.07.04 |
---|---|
[Spring] Spring MVC - 데이터 엑세스 계층(1) JDBC (15) | 2022.06.30 |
[Spring] 컴포넌트 스캔 (44) | 2022.06.20 |
[Spring] 스프링 컨테이너와 빈 ( 생성, 등록, 조회 ) (44) | 2022.06.17 |
[Spring] Bean Scope (Singleton pattern) (43) | 2022.06.16 |