AOP가 필요한 상황?
- 모든 메서드의 호출 시간 측정
- 공통 관심 사항 vs 핵심 관심 사항
메소드 호출 시간을 측정을 위해 메소드 안에 아래와 같은 로직을 추가 했을때 문제점이 있다.
- 회원조회 메소드의 기능핵심은 시간측정이 아니다.
- 시간 측정 로직은 공통 관심 사항이다.
- 시간 측정 로직과 해당 비즈니스 로직이 섞여서 유지보수가 어렵다.
- 시간 측정 로직을 별도의 공통 로직으로 만들기 매우 어렵다.
- 시간 측정 로직을 변경할 때 전부 찾아서 수정해야한다.
AOP적용
- 공통 관심 사항 vs 핵심 관심 사항 분리
AOP 패키지와 클래스를 생성한다
아래와 같은 어노테이션을 붙여준다.
@Aspect : 공통 관심사를 모듈화한다. 공통 기능을 구현한다.
@Component : Bean으로 등록해준다. (컴포넌트 스캔)
@Around : 관심사를 적용할 시점을 지정한다.
<service 하위 모두 지정>
ex1 ) @Around("execution(* mini_project.mini_project_solyi.service..*(..))")
<패키지 하위 모두 지정>
ex 2) @Around("execution(*[모듈명]..*(..))")
호출 시간 측정 기능을 구현한다.
ProceedingJoinPoint ?
joinPoint의 확장으로 @Around를 사용할때 사용이 가능하다.
proceed 메소드를 사용하여 비즈니스 메소드를 진행하도록 한다. (즉, proceed 메소드 호출 전 - 비즈니스 메소드 호출 전, proceed 메소드 호출 후 - 비즈니스 메소드 호출 후)
스프링 AOP 동작 방식
AOP 적용 전 의존관계
컨트롤러 ----------> 서비스
AOP 적용 후 의존관계
컨트롤러 ----------> 프록시 (가짜 서비스) ----------> joinPoint.proceed() ----------> 서비스(진짜)
AOP 적용 후 전체
프록시 (컨트롤러) ----------> 컨트롤러 ----------> 프록시 (서비스) ----------> 서비스----------> 프록시 (레파짓토리) ----------> 레파짓토리
실제 프록시가 주입이 되는지 콘솔창에서 확인해보자..
콘솔창에 Enhancer ~ CGLIB 라고 찍혀있다.
서비스를 복제해서 코드를 조작하는 기술이라고 한다. (프록시)
인프런 강의를 보면서 공부했습니다!
'스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술'