[스프링 입문] AOP가 필요한 상황

enxnong·2023년 5월 6일
0

Spring

목록 보기
22/26

김영한님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술을 보면서 공부한 내용입니다.

AOP가 필요한 상황

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

모든 메소드의 호출 시간을 측정하고 싶은 경우?

→ 무수히 많은 메소드의 시간 측정을 시작과 끝 사이에 넣어야 되는 경우가 발생함.

즉, 메소드는 무수히 많이 존재할 수 있기 때문에 모든 메소드에 시간 측정 로직을 집어넣을 수 없음.

AOP를 통해 공통 로직을 짜서 집어넣어야함.

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

        long start = System.currentTimeMillis(); // 메소드 호출 시작

        try{ // 핵심 로직
            // 조건 : 같은 이름이 있는 회원은 중복 가입x
            validateDuplicateMember(member); // 중복 회원 검증

            memberRepository.save(member); // 중복 아닌 경우 저장
            return member.getId(); // 아이디 반환
        } finally {
            long finish = System.currentTimeMillis(); // 메소드 호출 끝
            long timeMs = finish - start;
            System.out.println("join : " + timeMs + "ms");
        }

    }

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

문제

  • 회원가입, 회원 조회에 시간을 측정하는 기능은 핵심 관심 사항이 아니다. (try문 안에 있는 것이 핵심 로직이다)
/**
 * 회원 가입
 */
try{ // **핵심 관심 사항**
    validateDuplicateMember(member);
    memberRepository.save(member);
    return member.getId();
 }

/**
 * 전체 회원 조회
 */
try{ // **핵심 관심 사항**
	  return memberRepository.findAll();
}
  • 시간을 측정하는 로직은 공통 관심 사항이다.
long start = System.currentTimeMillis(); // 메소드 호출 시작
long finish = System.currentTimeMillis(); // 메소드 호출 끝
long timeMs = finish - start;
  • 시간을 측정하는 로직과 핵심 비즈니스의 로직이 섞여서 유지보수가 어렵다.
  • 시간을 측정하는 로직을 별도의 공통 로직으로 만들기 매우 어렵다.
  • 시간을 측정하는 로직을 변경할 때 모든 로직을 찾아가면서 변경해야 한다
profile
높은 곳을 향해서

0개의 댓글