[Spring] 스프링 AOP : @AOP

2022. 10. 31. 13:31JAVA/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
[인프런] 스프링 프레임워크 핵심 기술