[Spring] 스프링 AOP : @AOP
2022. 10. 31. 13:31ㆍJAVA/Spring
1. Aspect 정의
- @Aspect
- 빈으로 등록하기 위해서 @Component 추가
2. Pointcut 정의
- @Pointcut(표현식)
- 주요 표현식
- execution
- @annotation
- bean
- Pointcut 조합
- &&, ||, !
3. Advice 정의
- @Before
- @AfterReturning
- @AfterThrowing
- @Around
4. AOP 구현 실습
1. 의존성 추가
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-aop'
}
2. Aspect 클래스 정의 및 빈 등록
@Aspect
@Component
public class PerfAspect {
}
3. Pointcut 및 Advice 모듈 정의
@Around("@annotation(PerfLogging)")
public Object logNow(ProceedingJoinPoint pjp) throws Throwable {
System.out.println(LocalDateTime.now());
Object retVal = pjp.proceed();
return retVal;
}
- Pointcut : PerLogging 애노테이션이 적용된 메서드에만 위 Advice를 수행
- Advice : 메서드를 수행하기 전에 현재 시간을 출력
4. PerfLogging 애노테이션 정의
/**
* 이 애노테이션을 사용하면 성능을 로깅해 줍니다.
*/
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS)
public @interface PerfLogging {
}
- @Target(ElementType.METHOD) : 애노테이션 적용 대상은 메서드라는 의미입니다.
- @Retention(RetentionPolicy.CLASS) : 애노테이션이 언제까지 살아있을지 결정하는 정책입니다. CLASS이기 때문에 컴파일되어 클래스 코드(바이트 코드)까지 남아있을 것입니다.
5. PerfLogging 애노테이션을 메서드에 적용
@Service
public class SimpleEventService implements EventService {
@PerfLogging
@Override
public void createEvent() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("Created an Event");
}
@PerfLogging
@Override
public void publishEvent() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("Published an event");
}
@Override
public void deleteEvent() {
System.out.print("Deleted an Event");
}
}
- createEvent, publishEvent 메서드에만 @PerfLogging 애노테이션을 적용하여 두 메서드가 수행될때에만 오늘 시간 출력
6. 테스트 코드 추가하고 실행 결과 확인
@SpringBootTest
public class SimpleEventServiceTest {
@Qualifier("simpleEventService")
@Autowired
private EventService eventService2;
@Test
public void testPerfAspect(){
eventService2.createEvent();
eventService2.publishEvent();
}
}
2022-10-31T13:26:02.200910700
Created an Event
2022-10-31T13:26:03.236173200
Published an event
- 실행 결과 : 핵심 메서드가 호출되기전에 오늘 시간이 출력된 것을 확인
References
source code : https://github.com/yonghwankim-dev/spring_study/tree/master/spring_aop/src/main/java/kr/yh
[인프런] 스프링 프레임워크 핵심 기술
'JAVA > Spring' 카테고리의 다른 글
[Spring][IoC] @Component와 컴포넌트 스캔(Component Scan) (0) | 2022.11.01 |
---|---|
[Spring] Null-safety : Null 관련 애노테이션 (0) | 2022.10.31 |
[Spring] 프록시 기반 AOP (0) | 2022.10.30 |
[Spring] Spring AOP(Aspect-Oriented Programming) 개념 (0) | 2022.10.30 |
[Spring] Spring Expression Language (0) | 2022.10.30 |