17.스프링 AOP

스프링 AOP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public interface EventService {
void createEvent();
void publishEvent();
void deleteEvent();
}

@Service
public class SimpleEventServeice implemets EventService {
@Override
public void createEvent() {
//로직
}

@Override
public void publishEvent() {
//로직
}

@Override
public void deleteEvent() {
//로직
}

}


@Component
public class AppRunner implemets ApplicationRunner {
@Autowired
EventService eventService;

@Override
public void run(.....){
eventService.createEvent();
eventService.publishEvent();
eventService.deleteEvent();
}

}

위와같이 코드를 작성하고 pom파일에 의존성을 추가하자.

1
2
3
4
5
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>

</dependency>

이제 해야할일(어드바이스) 어디에 적용할지(포인트컷)를 정하자

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

@Component
@Aspect
public class PerfAspect {

@Around("execution(* com.sangheon.*.EventService.*())")
// com.sangheon으로 시작하는 EventService의 모든 메서드에 아래 행위를 적용하라
// 포인트컷을 여러곳에서 재사용할것이 아니라면 이렇게 사용하라.

public Object logPerf(ProceedingJoinPoint pjp) {
//pjp는 어드바이스가 적용되는 대상 즉 메소드 자체로 보면된다.
long begin = System.currentTimeMills());
Object reVal = pjp.proceed();
return reVal;
}
}

위의 경우 모든 메소드에 적용된다. deleteEvent에는 적용되기를 원치 않을경우 @annotation 을 만들어서 사용해보자.

1
2
3
4
5
6
7

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS) //컴파일까지 해당 어노테이션을 유지.. 이 줄은 생략가능
public @interface PerLogging {

}

이 후 적용되길 원하는 메소드에만 @PerLogging를 붙이자

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

@PerLogging
@Override
public void createEvent() {
//로직
}

@PerLogging
@Override
public void publishEvent() {
//로직
}

@Override
public void deleteEvent() {
//로직
}

그리고 아래처럼 @Around 어노테이션을 수정하자

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

@Component
@Aspect
public class PerfAspect {

@Around("@annotation(PerLogging)")
// com.sangheon으로 시작하는 EventService의 모든 메서드에 아래 행위를 적용하라
// 포인트컷을 여러곳에서 재사용할것이 아니라면 이렇게 사용하라.

public Object logPerf(ProceedingJoinPoint pjp) {
//pjp는 어드바이스가 적용되는 대상 즉 메소드 자체로 보면된다.
long begin = System.currentTimeMills());
Object reVal = pjp.proceed();
return reVal;
}
}

이제 돌려보면 deleteEvent외에만 적용되는것을 확인할 수있다.

어드바이스 정의는 @Around 뿐만 아니라 @Before ,@AfterReturning, @AfterThrowing이 가능하다.

Share