[Spring] AOP(Aspect Oriented Programming)

dh·2022년 10월 23일
0

AOP 주요 개념

1. advice
-핵심 로직이 진행 될 때 실행해야할 공통 로직

2. point-cut
-핵심 로직

3. join point
-공통로직을(advice) 핵심로직(point-cut)에 언제 실행 할 것이냐 결정
1) @Before : 핵심로직 실행 전
2) @AfterReturning : 핵심로직 실행 후, 정상적인 종료일 때만
3) @AfterThowing : 핵심로직 실행 후, 예외가 발생했을 때만
4) @After : AfterReturning + AfterThowing
5) @Around : Before + After

4. Aspect
-Advice 를 언제(join-point) 누구에게(point-cut) 실행 하는 것을 설정

5. Weaving
-Advice를 point-cut에 적용하는 행위

6. proxy

Execution

execution(접근지정자(생략가능) 리턴타입 패키지명.클래스명.메서드명(매개변수타입))
- execution(public *.*)         : 모든 public 메서드
- execution( * set*())          : 모든 set으로 시작하는 메서드들 중 매개변수가 없는것
- execution( * set*(*))         : 모든 set으로 시작하는 메서드들 중 매개변수가 한개 선언한것
- execution( * set*(*,*))       : 모든 set으로 시작하는 메서드들 중 매개변수가 두개 선언한것
- execution( * set*(Integer, *)): 모든 set으로 시작하는 메서드들 중 매개변수가 두개 선언한것, 첫번째는 Integer
- execution( * set*(..))        : 모든 set으로 시작하는 메서드들 중 매개변수가 0개 이상 상관 X

예시

pom.xml

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-aop -->
		<dependency>
		    <groupId>org.springframework.boot</groupId>
		    <artifactId>spring-boot-starter-aop</artifactId>
		</dependency>

StudyBootApplication

main함수가 있는곳에 EnableAspectJAutoProxy 선언(생략 가능)

@SpringBootApplication
//@EnableAspectJAutoProxy (생략 가능)
public class StudyBootApplication {

	public static void main(String[] args) {
		SpringApplication.run(StudyBootApplication.class, args);
	}

}

Transport.java (point-cut)

public class Transport {
	// point-cut
	public void takeBus() {
		log.info("-------------버스타기------------");
	}
	
	public void takeSubway() {
		log.info("-------------지하철타기------------");
	}
	
	public void getTaxi() {
		log.info("-------------택시타기------------");
	}
	
	public void airPlane() {
		log.info("-------------비행기타기------------");
	}
}

Card.java (advice)

@Component
@Slf4j
@Aspect
public class Card {
	//Aspect
	@Before("execution(* com.iu.home.aop.test.Transport.airPlane())")
	public void before() {
		log.info("===============Before===============");
	}
	
	@After("execution(* com.iu.home.aop.test.Transport.get*())")
	public void after() {
		log.info("===============After===============");
	}
	
	@Around("execution(* com.iu.home.aop.test.Transport.take*())")
	public Object cardCheck(ProceedingJoinPoint joinPoint)throws Throwable {
		log.info("-------삑 승차-----------");
		Object obj = joinPoint.proceed();
		log.info("-------삑 하차-----------");
		return obj;
	}
	
}

0개의 댓글