코드스테이츠_국비교육/[Section2]

38~39_[Spring Core] AOP 키워드_22.10.17~22.10.18

생각없이 해도 생각보다 좋다. 2022. 10. 17. 17:44

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

*/