분류 전체보기 1341

Ch11. 스프링 AOP(포인트컷) - execution

execution 문법 execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?namepattern(param-pattern) throws-pattern?) execution(접근제어자? 반환타입 선언타입?메서드이름(파라미터) 예외?) 메서드 실행 조인 포인트를 매칭 한다. ? 는 생략할 수 있다. * 같은 패턴을 지정할 수 있다. 가장 정확한 포인트 컷 @Test public void exactMatch() { //public java.lang.String hello.aop.member.MemberServiceImpl.hello(java.lang.String) pointcut.setExpression( "execution(public ..

Ch11. 스프링 AOP(포인트컷) - 포인트컷 지시자

AspectJ는 포인트 컷을 편리하게 표현하기 위한 특별한 표현식을 제공한다 포인트 컷 표현식은 AspectJ pointcut expression 즉 AspectJ가 제공하는 포인트 컷 표현식을 줄여서 말하는 것이다. 포인트 컷 지시자 포인트컷포인트 컷 표현식은 execution 같은 포인트 컷 지시자(Pointcut Designator)로 시작한다. 줄여서 PCD라 한다 포인트 컷 지시자의 종류 execution : 메서드 실행 조인 포인트를 매칭 한다. 스프링 AOP에서 가장 많이 사용하고, 기능도 복잡하다. within : 특정 타입 내의 조인 포인트를 매칭한다. args : 인자가 주어진 타입의 인스턴스인 조인 포인트 this : 스프링 빈 객체(스프링 AOP 프록시)를 대상으로 하는 조인 포인트..

Ch10. 스프링 AOP(구현) - 스프링 AOP 구현(어드바이스 종류)

어드바이스 종류 @Around : 메서드 호출 전후에 수행, 가장 강력한 어드바이스, 조인 포인트 실행 여부 선택, 반환 값 변환, 예외 변환 등이 가능 @Before : 조인 포인트 실행 이전에 실행 @AfterReturning : 조인 포인트가 정상 완료 후 실행 @AfterThrowing : 메서드가 예외를 던지는 경우 실행 @After : 조인 포인트가 정상 또는 예외에 관계없이 실행(finally) Around가 큰 기능이고 이를 조각조각 낸 것들이 나머지 기능들이다. @Slf4j @Aspect public class AspectV6Advice { @Around("hello.aop.order.aop.Pointcuts.orderAndService()") public Object doTransact..

Ch10. 스프링 AOP(구현) - 스프링 AOP 구현(어드바이스 순서)

어드바이스는 기본적으로 순서를 보장하지 않는다. 순서를 지정하고 싶으면 @Aspect 적용 단위로 org.springframework.core.annotation.@Order 애노테이션을 적용해야 한다. 문제는 이것을 어드바이스 단위가 아니라 클래스 단위로 적용할 수 있다는 점이다. 그래서 지금처럼 하나의 애스펙트에 여러 어드바이스가 있으면 순서를 보장받을 수 없다. 따라서 애스펙트를 별도의 클래스로 분리해야 한다. 현재 로그를 남기는 순서가 아마도 [ doLog() doTransaction() ] 이 순서로 남을 것이다. (참고로 이 순서로 실행되지 않는 분도 있을 수 있다. JVM이나 실행 환경에 따라 달라질 수도 있다.) @Slf4j public class AspectV5Order { @Aspect..

Ch10. 스프링 AOP(구현) - 스프링 AOP 구현(포인트컷 참조)

참고로 외부에서 호출할 때는 포인트 컷의 접근 제어자를 public으로 열어두어야 한다. Pointcut 조합 public class Pointcuts { //hello.aop.order 패키지와 하위 패키지 @Pointcut("execution(* hello.aop.order..*(..))") public void allOrder() { } //pointcut signature //클래스 이름 패턴이 *Service @Pointcut("execution(* *..*Service.*(..))") public void allService() { } //allOrder && allService @Pointcut("allOrder() && allService()") public void orderAndServ..

Ch10. 스프링 AOP(구현) - 스프링 AOP 구현(어드바이스 추가)

@Slf4j @Aspect public class AspectV3 { //hello.aop.order 패키지와 하위 패키지 @Pointcut("execution(* hello.aop.order..*(..))") private void allOrder() { } //pointcut signature //클래스 이름 패턴이 *Service @Pointcut("execution(* *..*Service.*(..))") private void allService() { }//내부에서만 사용 @Around("allOrder()") //재활용 가능 public Object doLog(ProceedingJoinPoint joinPoint) throws Throwable { log.info("[log] {}", joi..

Ch10. 스프링 AOP(구현) - 스프링 AOP 구현(포인트컷 분리)

Around에 포인트 컷 표현식을 직접 넣을 수 도 있지만, @Pointcut 애노테이션을 사용해서 별도로 분리할 수 도 있다 @Pointcut 에 포인트 컷 표현식을 사용한다. 메서드 이름과 파라미터를 합쳐서 포인트컷 시그니처(signature)라 한다. 메서드의 반환 타입은 void 여야 한다. 코드 내용은 비워둔다. 포인트컷 시그니처는 allOrder()이다. 이름 그대로 주문과 관련된 모든 기능을 대상으로 하는 포인트 컷이다. @Around 어드바이스에서는 포인트 컷을 직접 지정해도 되지만, 포인트컷 시그니처를 사용해도 된다. 여기서는 @Around("allOrder()")를 사용한다. private , public 같은 접근 제어자는 내부에서만 사용하면 private을 사용해도 되지만, 다른 애..

Ch10. 스프링 AOP(구현) - 스프링 AOP 구현

AspectV1 @Around 애노테이션의 값인 execution(* hello.aop.order..*(..)) 는 포인트 컷이 된다. @Around 애노테이션의 메서드인 doLog 는 어드바이스( Advice )가 된다. execution(* hello.aop.order..*(..)) 는 hello.aop.order 패키지와 그 하위 패키지(.. )를 지정하는 AspectJ 포인트 컷 표현식이다. 앞으로는 간단히 포인트 컷 표현식이라 하겠다. 참고로 표인트컷 표현식은 뒤에서 자세히 설명하겠다. 이제 OrderService , OrderRepository 의 모든 메서드는 AOP 적용의 대상이 된다. 참고로 스프링은 프록시 방식의 AOP를 사용하므로 프록시를 통하는 메서드만 적용 대상이 된다. 참고 스프..

Ch10. 스프링 AOP(구현) - 프로젝트 생성

OrderRepository 코드 @Slf4j @Repository public class OrderRepository { public String save(String itemId) { log.info("[orderRepository] 실행"); //저장 로직 if (itemId.equals("ex")) { throw new IllegalStateException("예외 발생!"); } return "ok"; } } OrderService 코드 @Slf4j @Service public class OrderService { private final OrderRepository orderRepository; public OrderService(OrderRepository orderRepository) { ..

Ch09. 스프링 AOP 개념 - AOP 용어 정리

조인 포인트(Join point) 어드바이스가 적용될 수 있는 위치, 메서드 실행, 생성자 호출, 필드 값 접근, static 메서드 접근 같은 프로그램 실행 중 지점 조인 포인트는 추상적인 개념이다. AOP를 적용할 수 있는 모든 지점이라 생각하면 된다. 스프링 AOP는 프록시 방식을 사용하므로 조인 포인트는 항상 메서드 실행 지점으로 제한된다. 포인트 컷(Pointcut) 조인 포인트 중에서 어드바이스가 적용될 위치를 선별하는 기능 주로 AspectJ 표현식을 사용해서 지정 프록시를 사용하는 스프링 AOP는 메서드 실행 지점만 포인트 컷으로 선별 가능 타켓(Target) 어드바이스를 받는 객체, 포인트 컷으로 결정 어드바이스(Advice) 부가 기능 특정 조인 포인트에서 Aspect에 의해 취해지는 ..