본문 바로가기

Spring/spring AOP25

스프링 코어 2 - 프록시 기술과 한계 프록시 기술과 한계 프록시 기술과 한계를 알아보자. 프록시 기술과 한계 - 1. 타입 캐스팅 JDK 동적 프록시와 CGLIB를 사용해서 AOP프록시를 만드는 방법에는 각각의 장단점이 있다. JDK 동적 프록시는 인터페이스가 필수이고, 인터페이스를 기반으로 프록시를 생성한다. CGLIB는 구체 클래스를 기반으로 프록시를 생성한다. 물론 인터페이스가 없고 구체 클래스만 있는 경우에는 CGLIB을 사용해야 한다. 그런데 인터페이스가 있는 경우에는 JDK동적 프록시나 CGLIB 둘 중에 하나를 선택할 수 있다. • proxyTargetClass=false : JDK 동적 프록시를 사용해서 인터페이스 기반 프록시 생성 • proxyTargetClass=true : CGLIB을 사용해서 구체 클래스 기반 프록시 생.. 2022. 1. 19.
스프링 코어 2 - 주의사항1 (내부 호출 문제와 해결) 프록시 내부 호출 문제 스프링은 프록시 방식의 AOP를 사용한다. 하여 AOP를 적용하기 위해서는 항상 프록시를 통해서 대상 객체(target)을 호출해야 한다. 만약 프록시를 거치지 않고 대상 객체를 직접 호출하면 AOP가 적용되지 않고, 어드바이스도 호출되지 않는다. AOP를 적용하면 스프링은 대상 객체 대신에 프록시를 스프링 빈으로 등록한다. 따라서 스프링은 의존관계 주입시에 항상 프록시 객체를 주입한다. 프록시 객체가 주입되기 때문에 대상 객체를 직접 호출하는 문제는 일반적으로 발생하지 않는다. 하지만 대상 객체의 내부에서 메서드 호출이 발생하면 프록시를 거치지 않고, 대상 객체를 직접 호출하는 문제가 발생한다. 예제를 통해 내부 호출이 발생할 때 어떤 문제가 발생하는지 알아보자. 아래는 간단한 .. 2022. 1. 17.
스프링 코어 2 - 스프링 AOP 실전 예제 예제 만들기 지금까지 학습한 내용을 활용하여 유용한 스프링 AOP를 만들어보자. • @Trace 어노테이션으로 로그 출력하기 • @Retry 어노테이션으로 예외 발생 시 재시도 하기 먼저 AOP를 적용할 예제를 만든다. 간단한 Service와 Repository를 만드는데, Repository에서 5번의 요청이 올 때마다 의도적으로 예외를 터트린다. @RequiredArgsConstructor @Service public class ExamService { private final ExamRepository repository; public void save(String itemId){ repository.save(itemId); } } @Repository public class ExamReposito.. 2022. 1. 16.
스프링 코어 2 - 포인트컷-매개변수 전달, this와 target 매개변수 전달 다음은 포인트컷 표현식을 사용해서 어드바이스에 매개변수를 전달할 수 있다. this, target, args, @target, @within, @annotation, @args ex) @Before("allMember() && args(arg,..)") public void logArgs3(String arg) { log.info("[logArgs3] arg={}", arg); } • 포인트컷의 이름과 매개변수의 이름을 맞추어야 한다. 여기서는 arg 로 맞추었다. • 추가로 타입이 메서드에 지정한 타입으로 제한된다. 여기서는 메서드의 타입이 String 으로 되어 있기 때문에 다음과 같이 정의되는 것으로 이해하면 된다. args(arg,..) => args(String,..) 아래와 같이.. 2022. 1. 16.