✅ 학습목표
- 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 |