[Spring] 입문 7-1. AOP가 필요한 상황

강우엉·2023년 7월 10일

Spring

목록 보기
21/359

AOP가 필요한 상황을 알아보자

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

위의 상황 중 메서드의 호출 시간을 측정하고 싶다면 아래 코드처럼 메서드들의 코드를 하나하나 다 적어줘야 한다.

@Transactional
public class MemberService { // 핵심 비즈니스 로직 구현 (비즈니스에 가까운 용어들을 사용하는것이 일반적 repository와 반대)
    private final MemberRepository memberRepository;

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

    public Long join(Member member) { // 회원가입

        long start = System.currentTimeMillis();

        try {
            validateDuplicateMember(member); // 중복 회원 검증
            memberRepository.save(member); // save 호출
            return member.getId(); // 아이디만 반환
        } finally {
            long finish = System.currentTimeMillis();
            long timeMs = finish - start;
            System.out.println("join = " + timeMs + "ms");
        }
    }

    private void validateDuplicateMember(Member member) { // 중복 회원 검증
        memberRepository.findByName(member.getName())
                .ifPresent(m -> { // 만약 같은 값이 있으면
                    throw new IllegalStateException("이미 존재하는 회원입니다.");
                });
    }
    
    // 전체 회원 조회
    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");
        }
        
    }

이러한 코드는 아래와 같은 문제점이 있다.

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

다음 시간에 AOP를 적용시켜보자.

profile
우엉이의 코딩 성장일기💻

0개의 댓글