snaag / TIL

https://github.com/snaag/todo3/issues
3 stars 0 forks source link

22-12-20-TUE #30

Open snaag opened 1 year ago

snaag commented 1 year ago
snaag commented 1 year ago

스프링 입문강의 > AOP

AOP 가 필요한 상황

AOP

예시

/**
 * 회원 가입
*/

// before
// 핵심 비즈니스 로직만 있었음
public Long join(Member member) {
  validateDuplicateMember(member); // 중복 회원 검증
  Member joinMember = memberRepository.save(member);
  return joinMember.getId();

}

// after
// 함수의 실행 시간을 재는 로직이 추가되면서, 핵심 비즈니스 로직과 섞여 지저분해짐
public Long join(Member member) {

  long start = System.currentTimeMillis();

  try {
    validateDuplicateMember(member);
    Member joinMember = memberRepository.save(member);
    return joinMember.getId();
  } finally {
    long finish = System.currentTimeMillis();
    long timeMs = finish - start;
    System.out.println("join = " + timeMs + "ms");
  }
}
/**
 * 전체 회원 조회
*/

// before
// 핵심 비즈니스 로직만 있었음
public List<Member> findMembers() {
  return memberRepository.findAll();
}

// after
// 함수의 실행 시간을 재는 로직이 추가되면서, 핵심 비즈니스 로직과 섞여 지저분해짐
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");
  }
}

문제 해결

snaag commented 1 year ago

스프링 입문강의 > AOP

AOP 적용

AOP 란?

image

의존관계

image image

Spring 에서의 AOP or other...

Code

package hello.hellospring.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class TimeTraceAop {

    @Around("execution(* hello.hellospring..*(..))") // '패키지 하위에 다 적용해' 라는 뜻
    public Object execute (ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();
        System.out.println("START: " + joinPoint.toString()); // 함수 이름 얻어올 수 있음
        try {
            return joinPoint.proceed();
        } finally {
            long finish = System.currentTimeMillis();
            long timeMs = finish - start;
            System.out.println("END: " + joinPoint.toString() + " " + timeMs + "ms"); // 함수 이름 얻어올 수 있음

        }
    }
}

appendix) 순환참조 해결