프레임워크/Spring

[인프런][스프링 입문] 25~27 강

pythaac 2022. 3. 9. 20:24
  • AOP가 필요한 상황
  • AOP 적용
  • 다음으로

 

<스프링 입문 강의 - 25강 AOP가 필요한 상황>

* 시나리오

- [목표] 모든 메서드의 호출 시간을 측정하고 싶음

- [방안] 각 메서드마다 시간 측정 로직을 추가함

- [참고] 이 때 exception이 발생해도 실행되어야 하기 때문에 finally에 작성

- [문제1] 시간 측정 코드는 핵심 비즈니스 로직이 아니고 공통 관심 사항이므로, 핵심 관심 사항과 공통 관심 사항이 섞여 유지보수가 어려워짐

- [문제2] 시간 측정 로직은 별도 공통 로직으로 만들기 어려움

- [문제3] 시간 측정 로직을 변경하기 어려움

 

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

 


<스프링 입문 강의 - 26강 AOP 적용>

* AOP (Aspect Oriented Programming)

- 공통 관심 사항과 핵심 관심 사항을 분리하는 것

@Component
@Aspect
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");
        }
    }
}

 

* AOP 구현

- @Aspect 애노테이션 추가

- @Bean으로 등록 또는 @Component로 컴포넌트 스캔 사용

- @Around로 적용할 범위 지정

 

* 동작 방법

- proxy라는 기술로 가짜 빈을 사용

- 기존에는 memberController가 memberService를 직접 호출

- AOP를 적용하면, 스프링 컨테이너가 스프링 빈을 등록할 때 가짜 memberService를 세워둠

- joinPoint.proceed()를 호출하면 그 때 진짜 memberService를 호출

 

 


<스프링 입문 강의 - 27강 다음으로>

* 개발자가 해야할 일

- 우리는 스프링을 만드는 개발자가 아니기 때문에 거대한 스프링의 모든 것을 세세하게 알 필요는 없음

- 스프링을 활용하여 실무에서 발생하는 문제를 잘 해결하는 것이 훨씬 중요

- 따라서 핵심 원리를 이해하고, 문제 발생시 어디부터 찾으면 될지, 필요한 부분을 찾아 사용하는 능력이 중요