[시작]
이전 다양한 db연결방법 ( 3편 test code, JUnit, AssertJ )에 이어서 이번에는 각 코드가 실행하는데 얼마나 걸리는지 알아보도록 하겠습니다. 그리고 AOP를 사용하여 각 기능들의 처리속도를 log를 통해서 확인해 보도록 하겠습니다.
들어가기 전에 아래 설명에서는 전체적인 흐름 이해를 위하여 간단하게 구조나 부분 코드만 보여주기 때문에 전체 코드를 보시고 싶으시면 아래 github링크를 확인해 주세요.
[AOP (Aspect Oriented Programming) - 관점 지향 프로그래밍]
AOP 사용 이유
개발을 진행하다 보면 같은 코드를 여러 곳에 적용시켜야 하는 상황이 발생합니다. 이러한 공통 기능을 적용하기 위해 보통 상속을 사용하지만 java는 다중 상속이 불가능하다는 문제가 있습니다. 하지만 AOP를 사용하면 상속을 하지 않고 모든 코드에 반복 코드 즉 공통 관심사항을 따로 분리하여 핵심 관심사항과 분리시킬 수 있습니다. 본 예제에서는 모든 기능의 실행 시간을 확인해 볼 것인데 여기서 실행 시간을 확인하는 코드가 공통 관심 사항이 되고 실제 회원가입, 조회와 같은 코드가 됩니다.
이렇게 공통 관심 사항과 핵심 관심사항을 분리하게 되면 시간을 측정하는 코드와 비즈니스 코드가 분리되서 유지보수가 용이합니다.
그럼 바로 코드를 통해서 확인해 보겠습니다.
AOP 적용 전
이렇게 작성하면 결과는 잘 나오지만 3줄밖에 없던 비즈니스 코드가 무려2배 이상 늘어났고 이렇게 반복적으로 모든 코드에 try finally를 해서 작성해 줘야 합니다.
코드도 이전보다 훨신 복잡해 보이고 모든 코드에 이렇게 적용하면 유지보수 또한 어려워질 것입니다.
AOP 적용 후
이번에는 AOP를 적용해 보겠습니다.
먼저 AOP를 spring bean에 등록하기 위해 @Component를 달아줍니다. 그리고 @Around를 사용해서 어느 범위까지 AOP를 설정해 줍니다.
이렇게 하면 이제 이전에 구현한 시간을 측정하는 로직을 여기에 구현하면 됩니다.
코드에서 다른 부분이 있다면 try안에 joinPoint.proceed()를 하면 스프링 컨테이너가 프락시로 띄워놓은 가짜 bean에서 실제 bean을 실행합니다. 모든 작업이 끝나면 finally에서 시간을 계산해 timeMs를 출력합니다.
[실행]
이렇게 간단하게 AOP를 사용해서 공통 관심사항과 핵심 관심사항을 분리해 봤습니다. 😃
[코드]
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class TimeTraceAop {
@Around("execution(* com.tstory.yline.hellouser..*(..))")
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable{
long start = System.currentTimeMillis();
System.out.println("START: " + joinPoint.toString());
try{
return joinPoint.proceed();
}finally{
long end = System.currentTimeMillis();
long timeMs = end - start;
System.out.println("END: " + joinPoint.toString() + " " + timeMs + "ms");
}
}
}
지금까지 다양한 db 연결방법 1~4편을 작성해 봤습니다. 감사합니다. 😃
제가 잘못 알고 있거나 잘못된 부분이 있을 경우 알려주시고 추가로 궁금한 점 있으신 분들도 댓글이나 메일 주시면 성실히 답변해 드리겠습니다.🧑🏻💻
감사합니다~😄
[출처]
'Backend > spring' 카테고리의 다른 글
[ 스프링 ] 다양한 db연결방법 ( 3편 test code, JUnit, AssertJ ) (0) | 2021.11.03 |
---|---|
[ 스프링 ] 다양한 db연결방법 ( 2편 Jdbc , JdbcTemplate , Jpa , Spring Data Jpa ) (0) | 2021.10.14 |
[ 스프링 ] 스프링 부트 시작 (0) | 2021.10.11 |
[ 스프링 ] 다양한 db연결방법 ( 1편 HashMap ) (2) | 2021.10.11 |