AOP (Aspect Oriented Programming)
>개요
-Aspects
: Advice + PointCut = Aspect
: Advice, 부가 기능을 정의한 코드
: PointCut, 어드바이스를 어디에 적용할 지 결정하는 부분
-Core Concerns (핵심 기능)
: 업무 로직을 포함하는 기능
: 객체의 고유한 기능
-CROSS-CUTTING CONCERNS (부가적인 기능)
: 로깅, 보안, 트랜젝션 등
: 횡단 관심사라고도 함.
: 단독으로 사용되지 않고 핵심 기능과 함께 사용됨.
>Spring MVC
-@Controller
-@Service
-@Repository
>AOP
-등장 배경
: Core Concerns과 CROSS-CUTTING CONCERNS을 분리, 즉 관심사 분리를 명확히 하기 위해서 등장
-OOP 모듈화의 핵심 단위
: 클래스
-AOP 모듈화의 핵심 단위
: 관점
-의의
: 공통되는 부분을 모아서 다룰 수 있게 만듬.
>Core Concerns과 CROSS-CUTTING CONCERNS을 분리되지 않은 경우 문제점
-수정 및 유지 보수가 힘듬
-중복 코드 발생
AOP 용어
>Aspect
: 여러 객체에 공통으로 적용되는 기능
: advice + pointCut을 모듈화하여 애플리케이션에 포함
: 부가 기능(횡단 기능)에 관련된 역할을 맡은 키워드이다.
>Join Point
: 코드 실행 흐름이 변경되는 모든 포인트를 조인 포인트라고 하는 듯 하다. (아무리 사소한 변경일 지라도)
: 횡단 aspect는 핵심 기능 코드의 join point의 앞, 뒤로 추가한다.
: 스프링 AOP는 프록시 방식을 사용하므로 조인 포인트는 항상 메소드 실행 지점으로 제한됩니다.(??)
>Advice
: join point에서 수행되는 코드
>PointCut
: join point 중 advice가 적용될 위치를 선별하는 기능
>Weaving
: pointCut으로 결정된 타겟의 join point에 advice를 적용하는 것을 weaving이라고 함.
: advice를 핵심 코드에 적용하는 것
>AOP Proxy
>Target
>Advisor
Adivce 종류
>Advice 순서
: @Order 애너테이션을 이용함.
>Advice 종류
-Before Advice
: join point 실행 이전에 실행
: 타겟 메서드 실행 전 처리할 필요가 있는 공통 기능을 실행
: 일반적으로 Before Advice로 구현한 메서드는 void 리턴 타입을 사용
: 작업 흐름을 변경할 수 없다.
: 메서드가 성공적으로 종료되면 자동으로 다음 타겟 메서드가 실행되고, 예외사 발생하면 다음 타겟 메서드는 호출되지 않음.
-After returning
: join point 정상 완료 후 공통 기능을 실행
: returning 속성과 returning 절
-After throwing
: 메서드가 예외를 던지는 경우 공통 기능을 실행
: throwing 속성솨 throwing 절
-After(finally)
: join point 동작과는 상관없이 공통 기능을 실행
: 즉, 메서드 실행의 성공이든, 예외 던지는 상황이든 상관 없음
: 예외 처리(try-catch)부분에서 final 이랑 비슷한 듯.
: 일반적으로 리소스를 해제하는데 사용
-Around
: join point 실행 여부 선택, 반환 값 변환, 예외 변환 등이 가능한 강력한 advice
: 메서드 실행 전&후, 예외 발생 시점에 공통 기능을 실행함.
: ProceedingJoinPoint
: proceed()
Pointcut 표현식
>PointCut
: join point 중 advice가 적용될 위치를 선별하는 기능
: Aspect의 joinpoint를 결정하여 advice가 실행되는 시기를 제어함.
>AspectJ
: 포인트 컷을 편리하게 표현하기 위한 것.
: 특별한 표현식을 제공
>포인트컷 지시자
: 포인트컷 표현식의 시작 부분
: execution, 가장 많이 사용하는 지시자.
>포인트컷 표현식 결합
: &&, ||, ! 을 사용하여 포인트컷 표현식을 결합할 수 있음.
Join Point
>AOP 적용 위치
: 메서드 실행 위치 뿐 아니라 다양한 위치(join point)에도 적용 가능하다.
: 생성자, 필드 값 접근, static 메서드 접근, 메서드 실행
: 원리, join point의 인스턴스를 통해 해당 위치 정보를 제공 받고 AOP 메서드를 수행하는 원리
>JoinPoint
: AOP를 적용할 수 있는 지점
: 코드 흐름이 바뀌는 모든 지점
: AspectJ를 사용해서 컴파일 시점과 클래스 로딩 시점에 적용하는 AOP는 바이트코드를 실제로 조작하기 때문에 모든 지점에 AOP를 적용할 수 있음.
: 스프링 AOP는 proxy 방식을 사용하기 때문에 메소드 실행 지점에서만 AOP를 적용할 수 있음
: 스프링 빈에 AOP를 적용한다.
: proxy pattern은 오버라이딩 개념으로 동작한다.
>JoinPoint 인터페이스의 주요 기능
-메서드
: JoinPoint.getArgs(), JoinPoint.getThis() ,JoinPoint.getTarget(), JoinPoint.getSignature(), JoinPoint.toString()
>ProceedingJoinPoint 인터페이스
-proceed()
: 다음 어드바이스나 타겟을 호출함.
애너테이션을 이용한 AOP
>Spring AOP 지원
-@AspectJ 애너테이션 스타일
-스키마 기반 접근
>pointcut 선언
: advice가 실행되는 시기를 제어
: Pointcut 선언 = (pointcut signature + pointcut 표현식)
: pointcut signature, 메서드명+파라미터
: pointcut 표현식, 메서드 실행을 결정하는 부분
: @Pointcut 애너테이션 사용
>advice 선언
예제 코드
>예제코드 작성
>스프링 AOP 구현
-Aspect1; 기본 AOP
-Aspect2; 포인트 컷 분리
-Aspect3; 어드바이스 추가
-Aspect4; 포인트컷 참조
-Aspect5; 어드바이스 순서
-Aspect6; 어드바이스 종류
/*
참고 할 링크
https://engkimbs.tistory.com/m/746
*/
'코드스테이츠_국비교육 > [Section2]' 카테고리의 다른 글
39.02_[Spring] AOP_22.10.18 (1) | 2022.10.19 |
---|---|
39.01_[Spring] IoC, DI_22.10.18 (1) | 2022.10.18 |
36~37_[Spring Core] DI 키워드_22.10.13~22.10.14 (0) | 2022.10.17 |
35.03_[Spring] Spring Framework_Spring Boot_22.10.12 (0) | 2022.10.13 |
35.02_[Spring] Spring Framework_모듈 아키텍쳐_22.10.12 (0) | 2022.10.12 |