Spring Boot_AOP

이세미·2023년 5월 22일
0

SpringBoot

목록 보기
22/23
post-thumbnail

AOP가 필요한 상황

  • 모든 메소드의 호출 시간을 측정하고 싶다면?
  • 공통 관심 사항(cross-cutting concern) vs 핵심 관심 사항(core concern)
  • 회원 가입 시간, 회원 조회 시간을 측정하고 싶다면?

AOP 없이 회원 가입 시간 측정

 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");
        }
       
    }

우선 repository - service - MemberService의 join 메소드

long start = System.currentTimeMillis();

로 시작하는 시간을 저장한다.

총 걸린 시간은 logic이 끝날 때의 시간을 재야 하는 것이고,
예외가 터져도 시간은 찍혀야 하기 때문에
try - finally 문을 사용하여 예외를 잡아준다.

long finish = System.currentTimeMillis();

를 finally문 안에 적어주고,

long timeMs = finish - start;

finish - start를 한 결과물을 timeMs에 저장한다.

그리고

System.out.println("join = " + timeMs + "ms");

출력문을 작성해준다.

이렇게 작성하고,
회원가입을 돌려보면,
이러한 결과가 나오는 것이다.

또 위와 똑같이 findMembers에도

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");
        }
      // return memberRepository.findAll();
    }

이러한 코드를 작성해놓고,

돌려보면, 잘 돌아가는 것을 볼 수 있고
실행 결과를 확인하기 위해서
HelloSpringApplication을 실행시키고
localhost:8080의 회원 목록을 들어갔다가
다시 실행결과를 확인해보면
위와 같이 실행 시간이 확인된다.

위와 같은 방식의 문제

  • 회원가입, 회원 조회에 시간을 측정하는 기능은 핵심 관심 사항이 아니다.
  • 시간을 측정하는 로직은 공통 관심 사항이다.
  • 시간을 측정하는 로직과 핵심 비즈니스의 로직이 섞여서 유지보수가 어렵다.
  • 시간을 측정하는 로직을 별도의 공통 로직으로 만들기 매우 어렵다.
  • 시간을 측정하는 로직을 변경할 때 모든 로직을 찾아가면서 변경해야 한다

=> AOP 사용하여 해결

0개의 댓글