728x90
반응형
본 포스팅은 김영한 강사님의 인프런 강의 "스프링 입문"을 정리한 포스팅으로 강의 자료에서 사용한 자료를 사용했음을 밝힙니다.
수백개의 메소드가 있고 각각의 메소드마다 실행 시간을 알고싶다고 하자.
메소드가 시작할 때와 끝날 때의 시간의 차이를 계산하면 실행 시간을 알 수가 있다.
그러나 모든 메소드에 이러한 코드를 작성하면 유지보수도 어려워지고 많은 시간이 걸릴 것이다.
이럴 때 필요한 기술이 AOP(관점 지향 프로그래밍)이다.
AOP는 공통 관심 사항과 핵심 관심 사항을 분리하는 것이 필요하다.
위의 예시의 경우 메소드 실행 시간을 구하는 것을 공통 관심 사항으로 분리한 뒤 원하는 곳마다 적용시키면 된다.
aop라는 패키지를 만들고 그 안에 시간을 측정하는 TimeTraceAop 클래스를 생성했다.
@Aspect
@Component
public class TimeTraceAop {
@Around("execution(* hello.hellospring..*(..))")
public Object execute(ProceedingJoinPoint joinPoint)throws Throwable{
long start = System.currentTimeMillis();
System.out.println(joinPoint.toString());
try{
return joinPoint.proceed();
}finally{
long end = System.currentTimeMillis();
long time = end-start;
System.out.println(joinPoint.toString()+" : "+time);
}
}
}
- @Aspect : 해당 클래스가 공통적으로 적용할 클래스임을 알려줌.
- @Component : 컴포넌트 스캔으로 스프링 빈에 등록. 이 방법 대신 직접 스프링 빈에 등록해도 됨.
- @Around : 안에 point cut 표현식을 사용하여 공통적으로 적용할 메소드의 범위를 지정할 수 있다.
- joinPoint.toString() : 어떠한 메소드를 실행했는지 알려줌.
- joinPoint.proceed() : 다음 메소드를 실행하고 결과를 반환한다.
AOP를 적용하게 되면 프록시를 만들고 프록시를 통해서 AOP를 실행하고 joinPoint.proceed()가 실행되면 실제가 호출된다.
DI(dependency injection)으로 구현했기 때문에 이러한 것이 가능하다.
728x90
반응형
'공부 > Spring' 카테고리의 다른 글
[Spring][스프링 핵심 원리] 스프링 컨테이너와 스프링 (0) | 2023.01.12 |
---|---|
[InteliiJ] 인텔리제이 단축키 (0) | 2023.01.10 |
[Spring][인프런 스프링 입문] Test 코드 작성 (0) | 2023.01.02 |
[Spring][인프런 스프링 입문] JPA 기본 사용법 (2) | 2023.01.01 |
[Spring][인프런 스프링 입문] JdbcTemplate 사용법 (0) | 2022.12.31 |
댓글