애플리케이션 로직
핵심기능: 객체 고유 기능
부가 기능: 보조하기 위한 기능
AOP
부가 기능 도입시 문제점
1. 아주 많은 반복 필요
2. 중복 코드 만들어냄
3. 기능 변경시 많은 수정 필요
4. 적용 대상 변경시 많은 수정 필요
Aspect(관점)
부가 기능을 한 곳에서 관리하도록 변경
어디에 적용할지 선택하는 기능 추가
AOP (Aspect-Oriented-Programming)
Aspect를 사용한 프로그래밍 방식
AspectJ
J는 Java의 J
AOP의 대표적인 구현 프레임워크
스프링도 AOP를 제공하지만 대부분 AspectJ의 문법 차용(직접사용 X), 기능 일부만 제공
제공 기능
- 자바 프로그래밍 언어에 대한 완벽한 관점 지향 확장
- 횡단 관심사의 모듈화
- 오류 검사 및 처리
- 동기화
- 성능 최적화(캐싱)
- 모니터링 및 로깅
AOP 적용 방식
부가 로직을 실제로 추가하는 방법
1. 컴파일 시점 -> .class 파일 생성시 코드를 실제로 붙여버리는 방법, AspectJ 컴파일러 사용해야함
2. 클래스 로딩 시점 -> 자바 실행시 AspectJ 클래스 로더 조작기가 .class 파일 조작하여 JVM에 올림
3. 런타임 시점 -> 복잡한 과정(스프링 컨테이너의 도움 받음, 프록시, DI, 빈 포스트 프로세서 등)을 통해 프록시를 적용함
런타임 시점의 장점
- AspectJ의 컴파일러나 클래스 로더 조작기를 사용하지 않아도 된다.
런타임 시점의 단점
- 메서드 실행 시점에만 적용가능
- 생성자, static메서드, 필드 값 접근 등 불가능
AOP 용어 정리
- Join Point
- 어드바이스가 적용될 수 있는 모든 위치 (추상적 개념)
- Spring AOP에서는 항상 메서드 실행 시점으로 제한
- Pointcut
- 조인포인트 중에서 어드바이스가 적용될 위치를 선별
- AspectJ표현식 사용해서 지정
- Target
- 어드바이스를 적용 받는 객체
- Advice
- 부가기능
- Around, Before, After등
- Aspect
- 어드바이스 + 포인트컷을 모듈화함
- @Aspect
- Advisor
- 하나의 포인트컷 + 하나의 어드바이스로 구성
- 스프링 AOP에서만 사용되는 용어
- Weaving
- 포인트컷으로 결정한 타겟의 조인포인트에 어드바이스를 적용하는것
- AOP프록시
- AOP기능을 구현하기 위해 만든 프록시 (JDK or CGLIB)