📙 1. 관점 지향 프로그래밍 (AOP)
Annotation은 XML에서 Config(JAVA)로 넘어가기 위한 중간단계이다.
- @Configuration 어노테이션을 사용하면 기존에 applicationContext.xml 대신 ApplicationConfig.java을 사용할 수 있다.
사전에 예외처리를 해주는 애들
- Filter
- Interceptor
- AOP
AOP(Aspect Oriented Programming) 개요
- 핵심 관심 사항과 공통(부가) 관심 사항
- 핵심 관심 사항과 공통 관심 사항
- 기존 OOP에서는 공통관심사항을 여러 모듈에서 적용하는데 있어 중복된 코드를 양상하는 한계가 존재함
- 이를 해결하기 위해 AOP 등장
- AOP은 문제를 해결하기 위한 핵심 관심 사항과 전체에 적용되는 공통 관심 사항을 기준으로 프로그래밍함으로써 공통 모듈을 손쉬게 적용할 수 있게 함
- AOP는 관심사의 분리, 즉 핵심적인 기능에서 부가적인 기능을 분리한다.
- 분리한 부가기능을 어스펙트(Aspect)라는 독특한 모듈 형태로 만들어서 설계하고 개발하는 방법
- OOP(객체 지향 프로그래밍)를 적용하여도 핵심기능에서 부가기능을 쉽게 분리된 모듈로 작성하기 어려운 문제점을 AOP가 해결
- AOP는 부가기능을 어스펙트(Aspect)로 정의하여, 핵심기능에서 부가기능을 분리함으로써 핵심기능을 설계하고 구현할 때 객체지향적인 가치를 지킬 수 있도록 도와주는 개념
- 부가적인 기능 = Aspect(관점)
- Aspect J 라는 자바도 아니고 스프링도 아닌 것이 따로 있다. 이 녀석의 장점을 Spring이 흡수 → 이게 AOP
AOP 적용 예
- 간단한 메소드의 성능 검사(=로깅처리)
- 트랜잭션 처리
- @Transactional 은 메소드 위에 하면 트랜잭션 관리를 알아서 해주는데 이게 AOP이다.
- 예외 반환
- 아키텍처 검증
AOP 구조
📙 2. Spring AOP
AOP는 Spring이 만든게 아니라 외부에서 만들었다.
외부에서 만든 AOP의 장점을 Spring이 가져온거다.
Spring AOP 용어
- Target 대상
- 핵심기능을 담고 있는 모듈로 target은 부가기능을 부여할 대상이 됨
- Advice 시점
- 어느 시점(예 : method의 수행 전/후, 예외 발생 후 등..)에 어떤 공통 관심 기능(Aspect)을 적용할지 정의한 것
- Targeet에 제공할 부가기능을 담고 있는 모듈
- 핵심기능 이전 시점, 끝난 시점
- JoinPoint
- Aspect가 적용될 수 있는 지점(정상일 때 뭐할거니, 비정상일 때 뭐할거니)
- 함수 느낌
- Pointcut
- 공통 관심 사항이 실제 적용될 JoinPoint
- Advice 적용할 target의 method 선별하는 정규 표현식
- Pointcut 표현식은 execution으로 시작하고 method의 Signature를 비교하는 방법을 주로 이용
- Aspect(Advisor)
- 그냥 스프링 용어, Aspect = Advice + pointcut
- Weaving
- 어디에다 어떤 로직을 적용하는게 위빙
- 로직을 적용하는 걸 위빙이라함
Spring AOP 구조
- Pointcut에 정규표현식으로 설정한 핵심 기능들을 알아서 Weaving 한다.
Spring AOP 특징
- Spring은 프록시(proxy) 기반 AOP를 지원
- Spring은 Target 객체에 대한 Proxy를 만들어 제공
- Target을 감싸는 Proxy는 실행시간(Runtime)에 생성
- Proxy는 Advice를 Target 객체에 적용하면서 생성되는 객체
- 프록시(Proxy)가 호출을 가로챈다 (Intercept)
- Proxy는 Target 객체에 대한 호출을 가로챈 다음 Advice의 부가기능 로직을 수행하고 난 후에 Target의 핵심 기능 로직을 호출 (전처리 Advice)
- 또는 Target의 핵심 기능 로직 method를 호출한 후에 부가기능(Advice)을 수행하는 경우도 있다(후처리 Advice)
- Spring AOP는 method JoinPoint만 지원
- 동적 Proxy를 기반으로 AOP를 구현하므로 method JoinPoint만 지원함
📙 3. Spring AOP 구현
Spring AOP 구현 방법
- POJO Class 를 이용한 AOP 구현
- Spring API를 이용한 AOP 구현
- Annotation을 이용한 AOP 구현
Advice와 annotation
참고 출처 : https://sharonprogress.tistory.com/195