Spring/스프링 입문 - 스프링 부트, 웹 MVC, DB 접근 기술

19. AOP | 모든 메소드의 호출 시간을 측정하고 싶다면?

DEV-HJ 2023. 3. 5. 23:10
반응형

AOP가 필요한 상황 

모든 메소드의 호출 시간을 측정하고 싶다면?

공통 관심 사항(cross-cutting concern) vs 핵심 관심 사항(core concern)

회원 가입 시간, 회원 조회 시간을 측정하고 싶다면?


1. MemberService 회원 조회 시간 측정 추가

문제

- 회원가입, 회원 조회에 시간을 측정하는 기능은 핵심 관심 사항이 아니다.

- 시간을 측정하는 로직은 공통 관심 사항이다.

- 시간을 측정하는 로직과 핵심 비즈니스의 로직이 섞여서 유지보수가 어렵다.

- 시간을 측정하는 로직을 별도의 공통 로직으로 만들기 매우 어렵다.

- 시간을 측정하는 로직을 변경할 때 모든 로직을 찾아가면서 변경해야 한다.

 

해결방법 : https://icandoitprogramming.tistory.com/entry/20-AOP-%EC%A0%81%EC%9A%A9

 

MemberService.java

package hello.hellospring.service;

import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemberRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Optional;


@Transactional
public class MemberService {

    private final MemberRepository memberRepository;

    public MemberService(MemberRepository memberRepository)
    {
        this.memberRepository = memberRepository;
    }

    /**
     * 회원가입
     * */

    public Long join(Member member){

        long start = System.currentTimeMillis();
        try{
            validataDuplicateMember(member); //중복회원 검증
            memberRepository.save(member); //중복회원 검증 통과하면 저장
            return member.getId();
        } finally {
            long finish = System.currentTimeMillis();
            long timeMs = finish - start;
            System.out.println("join = "+timeMs+" ms");
        }


    }

    private void validataDuplicateMember(Member member) {
        memberRepository.findByName(member.getName())
              .ifPresent(m -> {
                throw new IllegalStateException("이미 존재하는 회원 입니다.");
          });
    }

    /**
     * 전체 회원조회
     * */
    public List<Member> findMember(){

        long start = System.currentTimeMillis();
        try {
            return memberRepository.findAll();
        } finally {
            long finish = System.currentTimeMillis();
            long timeMs = finish - start;
            System.out.println("findMember = "+timeMs+" ms");
        }

    }

    // id로 하나의 회원만 찾기
    public Optional<Member> findOne(Long memberId) {
        return memberRepository.findById(memberId);
    }


}

 

반응형