스프링 AOP를 알아보자! 섹션7 by 김영한

Karim·2023년 1월 31일
5

SpringBoot

목록 보기
10/15
post-thumbnail

1. 스프링 입문

💬

  • 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 by 김영한

  • gradle 추가

    implementation 'org.springframework.boot:spring-boot-starter-aop'

섹션 7. AOP

- AOP가 필요한 상황

  • AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다. 관점 지향은 어떤 로직을 기준으로 핵심 관심 관점, 공통 관심 관점으로 나누어서 보고 그 관점을 기준으로 모듈화( 분리 ) 하겠다는 것이다.

  • 공통 관심 사항( cross-cutting concern ) vs 핵심 관심 사항( core concern )

    공통 관심 사항 : 기능 수행 시 공통으로 수행되어야 하는 로직
    핵심 관심 사항 : 실제 비지니스 기능 로직

💡 필요한 상황 예제

aop 적용 전 무모하고 유지 보수가 어려운 로직 그림

  • 모든 메소드의 호출 시간을 측정하고 싶다면?

    모든 메소드 앞 뒤에 해당 로직을 추가해서 할 것인가?
    적용하고 싶은 코어 로직을 건들기 때문에 무모하고 유지보수관리 어려움!

  • 회원 가입 시간, 회원 조회 시간을 측정하고 싶다면
    : AOP를 적용하자!

    1. 회원가입, 회원 조회등 핵심 관심사항과 시간을 측정하는 고통 관심 사항을 분리한다.
    2. 시간을 측정하는 로직을 별도의 공통 로직으로 만들었다.
    3. 핵심 관심 사항을 깔끔하게 유할 수 있다.
    4. 변경이 필요하면 이 로직만 변경하면 된다.
    5. 원하는 적용 대상을 선택할 수 있다.

- AOP 적용

프록시 패턴의 AOP 적용 그림

💡 원리

  • 스프링 빈을 등록할 때 진짜 스프링 빈 말고 가짜 스프링 빈을 앞에 세워둔다.
  • 비지니스 로직이 수행된다.
  • 메소드 호출 마다 인터셉트가 걸리고 가짜 스프링 빈을 실행한다.
  • 가짜 스프링 빈이 끝나면
  • joinPoint.proceed()이 진짜 스프링 빈을 호출한다.

✒️ code

  • AOP -> TimeTraceAop.java
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class TimeTraceAop {

    /**
     * 메소드 시간 측정 APO 메소드
     */
    // 어디에 적용할지 범위 타겟팅 ( 아래 경로의 범위만 적용하겠다. )
    @Around("execution(* com.karim.restApiServer..*(..))")
    public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();
        System.out.println( "START : " + joinPoint.toString() );

        try {
            return joinPoint.proceed();
        }finally {
            long finish = System.currentTimeMillis();
            long timeMs = finish - start;
            System.out.println( "END : " + joinPoint.toString() + " " + timeMs + "ms" );
        }
    }
}

💻 실행 화면

  • 비지니스 로직 수행 후 해당 메소드 호출 시작 시간 및 종료 시간 -> AOP 로직이 수행된 것을 확인 할 수 있다.


📌 여담

  • 잘못된 부분이 있거나 수정될 부분이 있으면 피드백 주시면 감사하겠습니다.

📚 참고

profile
나도 보기 위해 정리해 놓은 벨로그

2개의 댓글

comment-user-thumbnail
2023년 2월 6일

정리가 진짜 깔끔하시고 보기 좋네요 저는 언제쯤 이렇게 정리를 할지..

1개의 답글