스프링 AOP

inhalin·2022년 7월 13일
0

김영한님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 강의를 듣고 정리한 내용입니다.

Aspect Oriented Programming, 관점 지향 프로그래밍

개발을 할 때 회원 가입, 회원 조회 등 비즈니스의 핵심 로직을 수행하는 것들을 핵심 관심 사항(core concern)이라고 하고, 보안, 로그, 메서드 호출 시간 측정과 같이 어플리케이션의 여러 군데에서 공통적으로 사용하고 싶은 기능들을 공통 관심 사항(cross-cutting concern)이라고 한다.

근데 이게 메서드마다 흩어져 있으면 중복코드가 많이 생기고 결합도도 높아져서 유지 보수가 힘들고 코드가 지저분해지기 쉽다. 이 때 AOP를 사용하면 이걸 한군데에 모아서 한꺼번에 원하는 곳에 적용해줄 수 있다.

AOP 적용 전/후 비교

적용 전

전체 회원 조회 메서드 안에서 직접 메스드 호출 시간을 측정하는 로직을 같이 작성해준 코드

public List<Member> findMembers() {
	long start = System.currentTimeMillis();    
    try {
        // 실제로 회원을 조회하는 코드는 여기 한줄임.
        List result = memberRepository.findAll();
    } finally {
        long finish = System.currentTimeMillis();
        long timeMs = finish - start;
        System.out.println("END: " + timeMs + "ms");
    }
    
    return result;
}

AOP 적용하기

  • 일단 지저분했던 시간 측정 코드는 다 지워주고 핵심 로직만 남긴다.
public List<Member> findMembers() {
    return memberRepository.findAll();
}
  • hello.hellosping.aop 패키지 만들고, TimeTraceAop.java 클래스를 생성한다.
  • @Aspect
  • @Component - 스프링에 Bean으로 등록하기 위해 추가해준다.
  • @Around("execution(* hello.hellosping..*(..))") - 괄호 안의 문법은 hello.hellosping 패키지 밑에 있는 모든 메서드에서 적용한다는 뜻이다.
@Aspect
@Component
public class TimeTraceAop {

    @Around("execution(* hello.springintro..*(..))")
    public Object exeute(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");
        }
    }
}

0개의 댓글