스프링 입문 (8) - AOP

2024. 3. 18. 22:10·스프링

만약 모든 메소드의 호출 시간을 측정하고 싶다면 어떻게 해야할까?

모든 메소드마다 시작시간과 종료시간을 측정하여 실행 시간을 출력하는 코드를 작성해야 할까?

그게 메소드 1000개에 적용해야 한다면 어떨까?

 

이때 우리는 AOP(Aspect Oriented Programming)라는 것을 이용할 수 있다.

AOP는 공통 관심 사항(cross-cutting concern)과 핵심 관심 사항(core concern)으로 나뉘는데, 시간 측정 로직은 이 중 공통 관심 사항이라고 할 수 있다.

시간 측정 로직은 핵심 관심 사항이 아니기 때문에 핵심 비즈니스 로직과 섞이게 되면 유지보수가 어렵고 공통 로직으로 만들기 매우 어렵다는 단점이 있기때문에 AOP를 이용해 분리해주는 것이다.

 

AOP 등록

hello/hellospring/aop/TimeTraceAop.java

package hello.hellospring.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 {
    
    // AOP가 적용되는 메소드들을 지정하는 문법
    @Around("execution(* hello.hellospring..*(..))")
    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");
        }
    }
}

 

이제 공통 관심 사항은 시간 측정 로직을 변경하려면 이 메소드만 수정하면 된다.

 

SpringConfig 추가 (@Component로 대체 가능)

    @Bean
    public TimeTraceAop timeTraceAop() {
        return new TimeTraceAop();
    }

 

 

AOP 적용 후 의존관계

가상의 프록시라는 가짜 스프링 빈을 만들어 실제 메소드를 실행시킨다.

DI덕분에 이런 기술을 구현할 수 있는것이다.

 

이런식으로 출력되는 것을 확인할 수 있다.

 

가상의 프록시도 확인해보자. MemberController의 코드를 아래와 같이 수정한다.

    @Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
        System.out.println("memberService = " + memberService.getClass());
    }

MemberService$$SpringCGLIB$$0와 같이 이상한 문자열로 출력되는 것을 볼 수 있는데, 이것이 CGLibrary를 이용한 가상의 프록시인 것이다.

 

 

사진, 코드 출처 - https://inf.run/hivx6

'스프링' 카테고리의 다른 글

로그인 정보를 쿠키에 담아서 보관하기  (0) 2024.10.15
스프링 입문 정리  (0) 2024.08.20
스프링 입문 (7) - DB 접근 기술  (0) 2024.03.18
스프링 입문 (6) - 회원 관리 예제 : 웹 MVC 개발  (0) 2024.03.18
스프링 입문 (5) - 스프링 빈과 의존관계  (0) 2024.03.15
'스프링' 카테고리의 다른 글
  • 로그인 정보를 쿠키에 담아서 보관하기
  • 스프링 입문 정리
  • 스프링 입문 (7) - DB 접근 기술
  • 스프링 입문 (6) - 회원 관리 예제 : 웹 MVC 개발
효재감자
효재감자
  • 효재감자
    효재감자의 우당탕탕 개발일지
    효재감자
  • 전체
    오늘
    어제
    • 분류 전체보기 (73)
      • 아무거나 (3)
      • 백준 (44)
      • 알고리즘 (4)
      • 자바 (1)
      • 리눅스(우분투) 및 클라우드 (2)
      • 스프링 (14)
        • 스프링 시큐리티 인 액션 (도서 정리) (5)
      • 플러터(Dart) (0)
  • 블로그 메뉴

    • 홈
    • Github
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    백준
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
효재감자
스프링 입문 (8) - AOP
상단으로

티스토리툴바