개발/Java & Kotlin

[Spring] 스프링 AOP (2)

devhooney 2022. 7. 4. 21:47
728x90
@Configuration
@EnableAspectAutoProxy
public class AppConfig {
	@Bean
    public ProductServiceImpl productService() {
    	return new ProductServiceImpl();
    }
    
    @Bean
    public ProductDaoImpl productDao() {
    	return new ProductDaoImpl();
    }
    
    @Bean
    public MyFirstAspect myFirstAspect() {
    	return new MyFirstAspect();
    }
}

스프링 코어 중 다른 하나인 DIxAOP 컨테이너의 AOP에 대해 알아보기

3.2.2 어노테이션으로 어드바이스 만들기

Before 어드바이스, After 어드바이스

- 어노테이션

@Before("PrimitivePointcut")

@After("PrimitivePointcut")

- 메소드명은 임의

- 메소드의 인수는 없는 것이 기본

- 메소드의 반환값은 void가 기본

@Before("execution(* findProduct(String))")
public void foo() {
	// 메소드가 시작 시 동작하는 어드바이스
    System.out.println("Hello Before - 메소드 호출 전에 나옴");
}

@After("execution(* findProduct(String))")
public void bar() {
	// 메소드 종료 후 동작하는 어드바이스
    System.out.println("Hello After - 메소드 호풀 후에 나옴);
}

- Before 어드바이스에 메소드명과 인수로 전달된 값을 조인포인트를 이용해 표시

@Before("execution(* findProduct(String))")
public void foo(JoinPoint jp) {
	// 메소드가 시작 시 삽입하는 어드바이스
    System.out.println("Hello Before - 메소드 호출 전에 나옴");
   	
    Signature sig = jp.getSignature();
    System.out.println("메소드 이름: " + sig.getName());
    
    Object[] obj = jp.getArgs();
    System.out.println("인수값: " + objs[0]);
}

 

AfterReturning 어드바이스

- 어노테이션: @AfterReturning(value="PrimitivePointcut", returning="반환값의 변수명")

- 메소드명은 임의

- 메소드의 인수는 AOP 적용 대상이 된 메소드의 반환형과 어노테이션의 returning 속성에서 지정한 변수명으로 해야함

- 메소드의 반환값은 void가 기본

// 반환값이 String인 getMessage 메소드에 어드바이스를 적용
@AfterReturning(value="execution(* getMessage())", returning="ret")
public void hoge(String ret) {
	// 메소드 호출이 예외를 내보내지 않고 종료했을 때 호출되는 어드바이스
    System.out.println("Hello Returning - 메소드를 호출한 후에 나옴");
    System.out.println("반환된 메시지: " + ret);
}

 

Around 어드바이스

- 어노테이션: @Around("PrimitivePointcut")

- 메소드명은 임의

- 메소드의 파라미터에는 반드시 org.aspectj.lang.ProceedingJoinPoint 기술

- 반환값은 AOP의 대상이 된 메소드의 반환값의 타입과 호환성이 있어야함.

@Around("execution(* getMessage( ))")
public String fuga(ProceedingJoinPoint pjp) throws Throwable {
	// 메소드 호출 전, 후로 동작하는 어드바이스
    System.out.println("Hello Around - Before 메소드 호출 전에 나옴");
    
    String message = (String)pjp.proceed();
    
    System.out.println("Hello Around - After 메소드 호출 후에 나옴");
    return message;
}

 

AfterThrowing 어드바이스

- 어노테이션: @AfterThrowing(value="PrimitivePointcut", throwing="예외의 변수명")

- 메소드명은 임의

- 메소드의 인수에는 잡고 싶은 예외를 기술하고 그 변수명은 어노테이션의 throwing 속성으로 지정한 "예외의 변수명"과 같아야 함

- 메소드의 반환값은 void가 기본

@AfterThrowing(value="execution(* getMessage())", throwing="ex")
public void boo(SQLException ex) {
	// 메소드의 호출이 예외를 던졌을 때 동작하는 어드바이스
    System.out.println("Hello Throwing - 예외가 생기면 나옴");
}

 

3.3 JavaConfig를 이용한 AOP

 

728x90

'개발 > Java & Kotlin' 카테고리의 다른 글

[Spring] 스프링 시큐리티 (2)  (0) 2022.07.05
[Spring] 스프링 시큐리티 (1)  (0) 2022.07.04
[Java] 람다와 스트림(5)  (0) 2022.07.04
[Spring] 스프링 AOP (1)  (0) 2022.07.01
[Java] 람다와 스트림(4)  (0) 2022.07.01