카테고리 없음

[spring]스프링 처음부터 공부하기(6) - AOP

k솔이 2022. 12. 27. 18:35

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 접근 기술'