AOP가 필요한 상황

학습 페이지

드디어 AOP에 왔다…. AOP는 이론적으로 접근하면 매우 어렵다고 한다.

C의 포인터같은 존재가 스프링의 AOP라고 한다.

AOP는 언제, 왜쓰는지를 알면 전혀 어렵지 않다! 디테일한 이론, 용어는 나중에 배우고 일단 언제, 왜 쓰는지를 알아보자.

Untitled

  1. 모든 메서드의 호출 시간을 측정해야 한다면??

메서드가 한 1,000개 된다면…? 모든 메서드에… 시간 측정 로직을 다 구성해서 시작과 끝에 다 넣어놨다고 해보자.. 근데 초단위로 해놨더니 상사가 밀리세컨드단위로 다시 해달라는 상황. 점심 나가서 먹을 것 같다.

한번 실습해보자…. 먼저 회원가입 메서드이다.

public Long join(Member member) {

        Long start = System.currentTimeMillis(); //시작시간 밀리세컨드로 받는다.

        try{
            validateDuplicateMember(member);

            memberRepository.save(member); // 인자로 들어온 멤버 리포지에 저장
            return member.getId();

            } finally { //try-fianlly구문 이용
            long finish = System.currentTimeMillis(); //끝나는 시간 측정
            long timeMs = finish - start; //끝난 시간 - 시작 시간 계산
            System.out.println("join() : "+timeMs+ "ms");
        }
    }

상사의 압박에 못이겨 시간측정 메서드를 추가했다…

try-finally는 무슨 구문인가? 예외처리 구문인건 맞는데, try에서 일어난 일과 관계없이 finally구문을 무조건 실행하는 구문이다.

아무튼.. 이렇게 만들고 테스트 코드를 돌려보자.

Untitled

이런식으로… 모든 메서드에 시간측정 로직을 만들어준다고 해보자…

   /**
     * 전체 회원 조회
     **/
    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");
        }
 }

1000개중에 2개 했다고 해보자… 스트레스가 정말 많이 쌓일 것이다.