월루를 꿈꾸는 대학생

[ Spring 입문] AOP 본문

Programing/Spring Boot

[ Spring 입문] AOP

하즈시 2023. 1. 25. 00:23
728x90

aop

 

aop 필요한 상황 

- 메서드의 호출 시간 측정할 때 (초를 밀리세컨드로 바꿀려면 일일이 수정필요)

 

메서드 앞과 끝에 시간을 측정하고 출력 

이런 걸 메서드별로 다 적으려고 하면 답답

 

public Long join(Member member){

    long start = System.currentTimeMillis();

    try{
        // 같은 이름이 있는 중복 회원 x 만약 해당 이름으로 못 찾은 경우를 대비해서 optional로 감쌈
        Optional<Member> result = memberRepository.findByName(member.getName());
        //ifPresent : result값이 null이 아니라 값이 있으면 동작하는 메서드
        // -> 옵셔널로 감싸면 옵셔널 가지고 있는 메서드 사용 가능
        // 값 자체를 꺼내고 싶으면 result.get()으로 꺼내기도 가능
        result.ifPresent(m-> {
            throw new IllegalStateException("이미 존재하는 회원입니다");
        });

        // 요렇게도 가능 짜피 옵셔널 반환이니까 한번에!
        validateDuplicateMember(member);

        memberRepository.save(member);
        return member.getId();
    }finally {
        long finish = System.currentTimeMillis();
        long timeMs = finish - start;
        System.out.println("join = " + timeMs + "ms");
    }



}

 

근데 이거는 핵심 비즈니스로직도 아님 그냥 곁다리 

공통 관심 사항임 .. 즉 모든 로직에 들어있는 공통 기능임 

이런 거가 섞여 있으면 유지보수가 힘들어짐 

 


 

시간 측정하는 로직을 한 곳에 두고 이걸 다른 로직에 가져다 쓰기만 하면 간편 

 

// aop 활용 위한
@Aspect
// 빈 등록
@Component

public class TimeTraceAop {

    // around 는 범위 지금은 해당 패키지명 아래 하위 파일에 적용 
    @Around("execution(* heloo.hellospring.*(..))")
    public Object execute(ProceedingJoinPoint joinPoint) throws Throwable{

        long start = System.currentTimeMillis();
        System.out.println("Start :  "+ joinPoint.toString());
        try{
            // 다음 메서드로 진행
            Object result = joinPoint.proceed();
            return result;
        }finally {
            long finsh = System.currentTimeMillis();
            long timeMs = finsh - start;
            System.out.println("End : " + joinPoint.toString() + " " + timeMs + "ms") ;
        }

    }
}

 

해당 코드가 각 로직이 실행될때마다 실행되어버림 

로직 될 때 인터셉트해서 해당 TimeTraceAop가 실행됨 

 

@Around 에서 범위를 한정시켜서 서비스 혹은 리포지토리만 설정할 수도 있음 

 

프록시 기술로 인터셉트후에 원래 로직이 동작함 

 

 

출처

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/dashboard

 

728x90