hyunjungkimm / aop

0 stars 0 forks source link

spring aop #1

Open hyunjungkimm opened 5 months ago

hyunjungkimm commented 5 months ago

aop

설정 파일

체크

AOP

@ Pointcut

image

트랜잭션 기능 동작

보통 트랜잭션을 service에 시작

어드바이스 순서

어드바이스 종류

JoinPoint - ProceedingJoinPoint(하위타입)

JoinPoint 인터페이스의 주요 기능

ProceedingJoinPoint 인터페이스의 주요 기능

@ Aspect 조인포인트 우선순위

@ Around 외에 다른 어드바이스가 존재하는 이유

@Around("hello.aop.order.aop.Pointcuts.orderAndService()") public void doBefore(JoinPoint joinPoint) { log.info("[before] {}", joinPoint.getSignature()); }

@Before("hello.aop.order.aop.Pointcuts.orderAndService()") public void doBefore(JoinPoint joinPoint) { log.info("[before] {}", joinPoint.getSignature()); }

좋은 설계는 제약이 있는 것

hyunjungkimm commented 5 months ago

Spring AOP - 포인트컷

포인트컷 지시자 (Pointcut Designator, PCD)

execution

within

args

this

target

@target

@within

@annotation

@args

bean

프록시 생성 방식에 따른 차이 (this, target)

JDK 동적 프록시

image

MemberService 인터페이스 지정

CGLIB

image

MemberService 인터페이스 지정

설정

* application.properties
* spring.aop.proxy-target-class = true // CGLIB - default
* spring.aop.proxy-target-class = false //JDK 동적 프록시 (인터페이스가 없다면 CGLIB를 사용함)

@SpringBootTest(properties = "spring.aop.proxy-target-class=false") //JDK 동적 프록시
//@SpringBootTest(properties = "spring.aop.proxy-target-class=true") //CGLIB - default

image

매개변수 전달

주의

args, @args, @target 포인트컷 지시자는 단독으로 사용 금지

hyunjungkimm commented 5 months ago

로그 출력 AOP

재시도 AOP

대표적인 AOP 예

hyunjungkimm commented 5 months ago

스프링 AOP 실무 주의사항

1. 내부 호출

스프링은 프록시 방식의 AOP를 사용하는데, 프록시 방식의 AOP는 메서드 내부 호출에 프록시를 적용할 수 없다.

내부 호출 대안1. 자기 자신 주입

내부 호출 대안2. 지연 조회

ObjectProvider(Provider)

내부 호출 대안3. 구조 변경

AOP 적용 단위

한계 - 타입 캐스팅, 의존관계 주입

JDK 동적 프록시 한계

JDK 동적 프록시 - 캐스팅, 의존관계 주입

CGLIB 프록시 캐스팅, 의존관계 주입

결론

CGLIB 프록시 한계

스프링 부트 - CGLIB 기본 사용