부트캠프 기록/Serction2

[Spring Core] AOP

bbangduck 2022. 10. 20. 22:27

✅ 학습목표

  • AOP의 의미 이해
  • AOP가 필요한 이유 이해
  • AOP에서 사용되는 용어들에 대한 이해
  • 타입별 Advice, Pointcut 표현식, JointPoint 등의 의미를 이해
  • 애너테이션을 이용한 AOP에 대한 이해

 

 

▶ AOP가 필요한 이유

sw 개발에서 변경 지점은 하나가 될 수 있도록 잘 모듈화 되어야 함

OOP만 사용해선 여러 곳에서 공통적으로 사용되는 부가 기능의 중복 코드가 발생하게 됨

중복되는 부가 기능에 수정 및 삭제가 필요하게 되면 사용되는 모든 곳에 수정 및 삭제 동작을 해줘야 함

 

즉, 부가 기능 코드를 깔끔하게 분리하기 힘들기 때문에 핵심 기능과 부가 기능을 분리하는 AOP 방식이 필요

 

OOP는 모듈화의 핵심 단위: Class

AOP의 모듈화의 핵심 단위:  Aspect

 

 

▶ AOP의 용어 및 개념

Aspect 

  • 여러 객체에 공통으로 적용되는 기능
  • 어드바이스 + 포인트컷

 

Join Point

  • 클래스 초기화, 객체 인스턴스화, 메소드 호출, 필드 접근, 예외 발생과 같은 애플리케이션 실행 흐름에서의 특정 포인트
  • 추상적인 개념이고 AOP를 적용할 수 있는 모든 지점
  • 스프링 AOP는 프록시 방식을 사용하므로 조인 포인트는 항상 메소드 실행 지점으로 제한
  • 어드바이스 적용이 피료한 곳은 애플리케이션 내에 메서드를 갖음

 

Advice

  • 조인포인트에서 수행되는 코드를 의미
  • 시스템 전체 애스펙트에 API 호출을 제공
  • 부가 기능

 

PointCut

  • 조인 포인트 중에서 어드바이스가 적용될 위치를 선별하는 기능
  • AspectJ 표현식을 사용해 지정

 

Weaving

  • 포인트컷으로 결정한 타겟의 조인 포인트에 어드바이스를 적용하는 것
  • AOP 적용을 위해 애스펙트 객체에 연결한 상태
  • 컴파일 타임(AspectJ compoiler)
  • 로드타임
  • 런타임, 스프링 AOP는 런타임, 프록시 방식

 

AOP Proxy

  • AOP 기능을 구현하기 위해 만든 프록시 객체
  • 스프링에서 AOP 프록시는 JDK 동적 프록시 또는 CGLIB 프록시

 

▶더 학습해볼 내용

  • 타입별 Advice( Before, After returning, After throwing, After(finally), Around)
    • 좋은 설계는 @Around만 사용해서 모두 해결하는 것보다는 제약을 가지더라도 실수를 미연에 방지하는 것
  • Pointcut 표현식
    • 포인트컷 지시자
    • 포인트컷 표현식 결합
더보기
  • 모든 공개 메서드 실행
    • execution(public * *(..))

 

  • set 다음 이름으로 시작하는 모든 메서드 실행
    • execution(* set*(..))

 

  • AccountService 인터페이스에 의해 정의된 모든 메소드의 실행
    • execution(* com.xyz.service.AccountService.*(..))

 

  • service 패키지에 정의된 메서드 실행
    • execution(* com.xyz.service.*.*(..))

 

  • 서비스 패키지 또는 해당 하위 패키지 중 하나에 정의된 메서드 실행
    • execution(* com.xyz.service..*.*(..))

 

  • 서비스 패키지 내의 모든 조인 포인트 (Spring AOP에서만 메서드 실행)
    • within(com.xyz.service.*)

 

  • 서비스 패키지 또는 하위 패키지 중 하나 내의 모든 조인 포인트 (Spring AOP에서만 메서드 실행)
    • within(com.xyz.service..*)

 

  • AccountService 프록시가 인터페이스를 구현하는 모든 조인 포인트 (Spring AOP에서만 메서드 실행)
    • this(com.xyz.service.AccountService)

 

  • AccountService 대상 객체가 인터페이스를 구현하는 모든 조인 포인트 (Spring AOP에서만 메서드 실행)
    • target(com.xyz.service.AccountService)

 

  • 단일 매개변수를 사용하고 런타임에 전달된 인수가 Serializable과 같은 모든 조인 포인트 (Spring AOP에서만 메소드 실행)
    • args(java.io.Serializable)

 

  • 대상 객체에 @Transactional 애너테이션이 있는 모든 조인 포인트 (Spring AOP에서만 메서드 실행)
    • @target(org.springframework.transaction.annotation.Transactional)

 

  • 실행 메서드에 @Transactional 애너테이션이 있는 조인 포인트 (Spring AOP에서만 메서드 실행)
    • @annotation(org.springframework.transaction.annotation.Transactional)

 

  • 단일 매개 변수를 사용하고 전달된 인수의 런타임 유형이 @Classified 애너테이션을 갖는 조인 포인트(Spring AOP에서만 메서드 실행)
    • @args(com.xyz.security.Classified)

 

  • tradeService 라는 이름을 가진 스프링 빈의 모든 조인 포인트 (Spring AOP에서만 메서드 실행)
    • bean(tradeService)

 

  • 와일드 표현식 *Service 라는 이름을 가진 스프링 빈의 모든 조인 포인트
    • bean(*Service)

 

'부트캠프 기록 > Serction2' 카테고리의 다른 글

아키텍처  (0) 2023.03.28
Spring Framework 특징  (0) 2023.03.26
부트캠프 2달차 KPT 회고  (0) 2022.10.19
[Spring Core]  (1) 2022.10.15
[Spring Core] spring container 와 bean  (0) 2022.10.14