해당 글은 <스프링 핵심 원리 - 고급편 (김영한)>을 참고하여 정리한 글입니다.
애플리케이션 로직 = 핵심 기능 + 부가 기능
- 핵심 기능 : 객체가 제공하는 고유 기능.
- 부가 기능 : 핵심 기능을 보조하는 기능.
같은 부가 기능을 여러 클래스에 걸쳐 함께 사용되는 경우, 유지/보수가 어렵다.
(별도의 유틸리티 클래스를 만든다해도 클래스를 호출하는 코드가 필요 & try-catch-finally 구조 등 복잡함)
일반적인 OOP 방식으로 해결이 어렵 => AOP (Aspect Oriented Programming) 사용!
AOP : 핵심 기능과 부가 기능을 분리
애플리케이션을 바라보는 관점을 하나하나의 기능에서 횡단 관심사(cross-cutting concerns) 관점으로 달리 보는 것.
AOP는 OOP를 대체하기 위한 것이 아닌, 횡단 관심사를 깔끔하게 처리하기 어려운 OOP의 부족한 부분을 보조하는 목적으로 개발됨.
AOP의 대표적인 구현으로 AspectJ 프레임워크가 있음.
스프링도 AOP를 지원하지만 AspectJ 문법 차용 및 프록시 방식의 AOP 적용(AspectJ 직접 사용X).
실무에서는 스프링이 제공하는 AOP 기능만 사용해도 대부분의 문제 해결 가능.
- AOP 적용 시점-
1. 컴파일 시점 : AspectJ 직접 사용, 번거롭고 운영 어려움
2. 클래스 로딩 시점 : AspectJ 직접 사용, 번거롭고 운영 어려움
3. 런타임 시점(프록시) : 실무에서는 스프링이 제공하는 AOP 기능만 사용해도 대부분의 문제 해결 가능
스프링이 A객체 생성하여 빈 포스트 프로세서에 전달
A객체가 적용 대상이면 A프록시 생성하여 A객체에서 A프록시로 대체
스프링 빈 저장소에 A프록시 등록 (적용 대상이 아니면 A객체 등록)
A프록시는 A객체를 참조하고 있음
조인 포인트(join point) : AOP를 적용할 수 있는 지점. 생성자, 필드 값 접근, static 메서드 접근, 메서드 실행
프록시를 사용하는 스프링 AOP의 조인 포인트는 메서드 실행으로 제한된다.
프록시 방식을 사용하는 스프링 AOP는 스프링 컨테이너가 관리할 수 있는 스프링 빈에만 AOP를 적용할 수 있다.
조인 포인트(Join point)
어드바이스가 적용될 수 있는 위치
AOP를 적용할 수 있는 모든 지점
스프링 AOP는 프록시 방식을 사용하므로 조인 포인트는 항상 메소드 실행 지점으로 제한됨
포인트컷(Pointcut)
조인 포인트 중에서 어드바이스가 적용될 위치를 선별하는 기능
주로 AspectJ 표현식 사용하여 지정
프록시를 사용하는 스프링 AOP는 메서드 실행 지점만 포인트컷으로 선별 가능
타겟(Target)
어드바이스가 적용되는 객체
포인트컷으로 결정
어드바이스(Advice)
부가기능
애스펙트(Aspect)
어드바이스 + 포인트컷을 모듈화 한 것
@Aspect
여러 어드바이스와 포인트컷이 함께 존재
어드바이저(Advisor)
하나의 어드바이스 + 하나의 포인트컷
위빙(Weaving)
핵심 기능 코드에 영향 없이 부가 기능 추가
AOP 적용을 위해 애스펙트를 객체에 연결한 상태
AOP 프록시(AOP Proxy)
AOP 기능을 구현하기 위해 만든 프록시 객체
스프링에서 AOP 프록시는 JDK 동적 프록시 또는 CGLIB 프록시이다.
해당 글은 <스프링 핵심 원리 - 고급편 (김영한)>을 참고하여 정리한 글입니다.
'Spring | Spring Boot' 카테고리의 다른 글
@ModelAttribute와 @RequestBody 차이점 (0) | 2024.02.17 |
---|---|
[Spring] @Configuration과 CGLIB의 관계 (0) | 2024.02.04 |