AOP

HOYA·2023년 4월 11일
0

스프링 입문

목록 보기
5/5
post-thumbnail

AOP가 필요한 상황

  • 모든 메소드의 호출 시간을 측정하고 싶을때
  • 회원 가입의 로직이 얼마나 걸리는지, 회원 조회 시간은 얼마나 걸리는지 측정하고 싶을 때
  • 상사가 시켰을 때

그렇다면 각 함수마다 시간 측정 로직을 달아볼까 ?

@Transactional
public class MemberService {
    /**
     * 회원가입
     */
    public Long join(Member member) {
        long start = System.currentTimeMillis();
        try {
            validateDuplicateMember(member); //중복 회원 검증
            memberRepository.save(member);
            return member.getId();
        } finally {
            long finish = System.currentTimeMillis();
            long timeMs = finish - start;
            System.out.println("join " + timeMs + "ms");
        }
    }

    /**
     * 전체 회원 조회
     */
    public List<Member> findMembers() {
        long start = System.currentTimeMillis();
        try {
            return memberRepository.findAll();
        } finally {
            long finish = System.currentTimeMillis();
            long timeMs = finish - start;
            System.out.println("findMembers " + timeMs + "ms");
        }
    }
}

문제

  • 로직을 각각 하나하나 추가 or 변경해야한다. (유지보수 어려움.)
  • 시간을 측정하는 로직은 핵심 비즈니스 로직이 아니다.
    등등 ..

AOP 적용

  • AOP: Aspect Oriented Programming
  • 공통 관심 사항(cross-cutting concern) vs 핵심 관심 사항(core concern) 분리

@Aspect
@Component
public class TimeTraceAop {

    @Around("execution(* springConquest.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");
        }
    }
}

aop > TimeTraceAop.java

해결

  • 회원가입, 회원 조회등 핵심 관심사항과 시간을 측정하는 공통 관심 사항을 분리한다.
  • 변경이 필요하면 이 로직만 변경하면 된다.

이런식으로 함수를 실행시켰을 때 시간이 측정된다.



⭐⭐⭐ 인프런에서 진행한 김영한님의 강의(스프링 입문)를 토대로 정리한 포스팅입니다. 자세한 내용은 링크를 참고하시기 바랍니다. ⭐⭐⭐

profile
[개발잠](https://mingeonho1.tistory.com/)으로 이전

0개의 댓글