Spring boot - AOP

범수·2024년 3월 4일

목차

  1. 프로젝트 생성하기
  2. View 환경설정
  3. 스프링 웹 개발 기초
  4. 회원 관리 예제
  5. 스프링 빈과 의존 관계
  6. 웹 MVC 제작
  7. DB 제작(1)
  8. DB 제작(2)
  9. AOP

1. 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"); // 총 시간 = 종료 시간 - 시작 시간
    }
}
// 회원가입 함수

<<문제점>>
1. 시간 측정은 핵심 로직이 아님(But 시간 측정 로직은 공통 사항)
2. 시간을 측정하는 로직과 핵심 비즈니스의 로직이 섞여서 유지보수 어려움(별도의 공통 로직으로 만드는 것도 힘듬)
3. 시간 측정 로직을 변경할 때 모든 로직을 찾아서 변경해야 함

AOP 적용

@Component	// @Bean으로도 등록 가능(선호)
@Aspect
public class TimeTraceAop {
   @Around("execution(* hello.hellospring..*(..))") // 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");
    	}
 	}
}
//hello.hellospring.aop.TimeTraceAop.java

<<해결>>

  • 시간을 측정하는 로직을 별도의 공통 로직으로 제작
  • 변경 시에도 공통 로직만 변경하면 됨(타겟팅도 가능)

AOP 동작 방식

<<기존 스프링 컨테이너>>
[컨트롤러 -> 서비스]

<<AOP 적용 후 의존 관계>>
[컨트롤러 -> 서비스(프록시) ->joinPoint.proceed()-> 서비스(실제)]

  • AOP의 Around범위를 지정하면 서비스가 지정되면서 프록시 생성
  • 컨트롤러가 프록시를 호출한 후 실제 서비스와 proceed가 함께 호출
profile
범수의 개발 놀이터😋

0개의 댓글