평행코드

<Spring> AOP (Aspect Orientied Programing) 본문

Spring

<Spring> AOP (Aspect Orientied Programing)

나의 오류는 누군가 겪었던 오류 2023. 12. 13. 23:45

AOP (Aspect Orientied Programing) → 관점지향프로그래밍

→ 공통의 관심사(서브기능)를 저장하는 aspect 클래스를 생성

 

Aspect클래스 선언하기

-pointcut : 타겟이 되는 메소드를 지정 → 패턴으로 지정(표현식)

-advisor : 실행할 시점을 설정 → 실행할 메소드에 선언

→ Before, After, Around(전후), AfterReturing, AfterThrowing

 

AOP적용하기

1. xml 방식

spring bean configuration.xml에 aop namespace를 추가

<aop:config>

<aop:aspect bean등록>

<aop:pointcut 표현식 아이디 설정>

<aop:before 또는 <aop:after> 또는 <aop:around> …

실행할메소드지정, 적용할 pointcut등록

execution 사용방법

execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?name-pattern(param-pattern) throws-pattern?)

여기서 사용한 방식 execution(* com.xyz.service.AccountService.*(..))

 

aop-context.xml파일을 새로 생성해 주었으면

web.xml에 <param-value>에 추가해주기!

 

2. 어노테이션방식

- aspect클래스 선언부에 @Component, @Aspect 어노테이션을 설정

(@Component 어노테이션을 이용하면 Bean Configuration 파일에 Bean을 따로 등록하지 않아도 사용할 수 있다.)

 

- 클래스 내부에 @Pointcut어노테이션을 선언한 메소드를 설정

 

- @Before 또는 @After 또는 @Around 또는 @AfterReturing …

실행할 메소드 선언부에 설정

 

- 어노테이션을 처리할 수 있게 springbeanconfiguration.xml에

<aop:aspectj-autoproxy>태그를 선언해줘야함.

maven dependency에 aspectjweaver모듈을 추가

 

AOP방식의 장점 & 언제사용하는지?

 

기존 코드를 뜯어고치지않고도 새로 메소드(기능)를 추가할 수 있다!!

기록을남길때도 유용하게 사용할 수 있고, 어떤 사람이 이 데이터를 수정, 삭제했는지 알 수 있도록 할 수 있다.

ex) 보안로직, 캐싱처리, 로그남길때 …

 

 

아래는 @Aspect 로 StopWatch 를 사용한 예시이다

StopWatch 사용하기
@Component
@Aspect
@Slf4j
public class AnnoLoggerAspect {
@Around("within(com.bs.spring..dao.*)")
	public Object daotest(ProceedingJoinPoint pj) 
			throws Throwable{
		// 전, 후 로직을 한번에 설정할 수 있음.
		// 지역변수를 전, 후 로직에서 공유할 수 있다.
		
		// 전, 후를 구분하는 구분자는 ProceedingJoinPoint클래스가 제공하는
		// proceed()메소드 호출이다. -> 반환 오브젝트
		// 전 : proceed()메소드를 호출하기 전 로직
		// 후 : proceed()메소드를 호출한 후 로직
		
		log.debug("===== around before log =====");
		StopWatch watch = new StopWatch();
		watch.start();
		
		Object obj = pj.proceed();
		log.debug("===== around after log =====");
		watch.stop();
		log.debug("실행 시간 : " + watch.getTotalTimeMillis()+"ms");
		
		return obj;
		
	}
}

'Spring' 카테고리의 다른 글

Spring boot  (0) 2023.12.19
<Spring> Security  (0) 2023.12.14
<Spring> 트랜잭션처리하기  (0) 2023.12.13
<Spring> 인터셉터(Interceptor)  (0) 2023.12.11
<Spring> bean validator 구현하는 방법  (1) 2023.12.11