AOP(Aspect oriented Programming) - 관점 지향 프로그래밍
한 어플리케이션 내의 다양한 모듈에서 공통적으로 이용되는 기능을 분리시켜 사용하는 것.
모듈의 핵심 기능 외의 기능을 해당 모듈에 응집되지 않도록 하기 위한 기술
* 공통적으로 이용되는 기능(공통 관심 사항)이란?
- 어떤 특정 모듈에서만 필요로 하는 것이 아니라, 어플리케이션 전반에 걸쳐 필요한 기능
. Logging 기능
. DB 트랜잭션 기능
. 보안
. 기타 등등...
* 순수 자바는 공통 관심 사항을 어떻게 적용할까?
- 상속!
단점 : - 다중상속이 불가능한 자바 특성상 다중 모듈에서 사용되는 공통 기능을 상속화 시키기 어렵다
- 상속은 코드 구현단에서부터 공통 모듈이 결정되는 정적 방식으로 비추...
- 공통 class
단점 : 메소드가 자신의 주요 기능만을 유지하는 것이 아니라, 외부적인 공통 모듈을 호출하는 코드를 갖게 된다.
자신에게 필요한 순수 기능만을 유지하는 방법은 없을까?
이러한 순수 자바의 상속/공통class 의 단점을 보완하기 위해
Spring AOP는 Aspect(관점) 이라는 특별한 객체로 모듈화하여 가각의 모듈에 공통 기능을 '끼워넣는' 방식을 사용.
* AOP 용어
- Aspect(관점)
여러 객체에 공통으로 적용되는 공통 관심 사항
- Advice
Aspect 가 해야할 작업 내용. 순수 부가기능 자체
- Joinpoint
어디에 Advice를 적용 할지에 대한 지점으로 메서드 호출, 필드값 변경 등이 여기에 속함.
code 와 Advice 를 연결해 주는 설정 정보
- Pointcut
Joinpoint의 부분 집합. 실제롤 Advice가 적용되는 Joinpoint
클래스/메소드명/정규표현식 등의 조건을 통해 선택된 Joinpoint 의 일부.
- Weaving
Advice. Pointcut 을 조합하여 어플리케이션에 적용하는 과정.
Weaving 시점 : 컴파일시(class파일생성), 클래스로딩시(JVM), 런타임시
스프링은 런타임시점에 Weaving 지원.
- Target
Advice 적용될 객체 (모듈)
- Proxy
Advice 를 Target 에 적용했을 때 생성되는 객체(Target + Advice)
실제 구현자가 원했던 공통모듈과 모듈의 원래 기능을 모두 수행할 수 있는 객체
* 스프링 AOP 특징
- 스프링 어드바이스는 자바로 구현한다.
- 스프링 Aspect 는 Runtime 시점에 만들어진다.
- 스프링은 메소드 조인포인트만 지원한다.(생성자/소멸자등의 조인포인트 지원불가)
* 스프링에서 AOP 구현시에 사용되는 방법
- 스프링API를 이용한 AOP 구현 - 사용성 하
- POJO 클래스를 이용한 AOP 구현 - 사용성 중
- AspectJ5에서 정의한 @Aspect 어노테이션 기반의 구현 - 사용성 상
=> 어떤 구현방식을 사용하던 스프링은 내부적으로 프록시 방식으로 AOP구현된다.