1. 스프링 AOP(Aspect Oriented programming)
- IoC가 결합도와 관련된 기능이라면, AOP는 응집도와 관련된 기능
- 메서드마다 공통으로 등장하는 로깅이나, 예외, 트랜잭션 처리같은 코드들을 '횡단관심'이라고함.
- 사용자의 요청에 따라 실제로 수행되는 핵심 비즈니스 로직을 '핵심관심' 이라함.

2. AOP 라이브러리 추가 실습해보기
<!-- AspectJ -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
<!-- AOP 실행을위한 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.8</version>
</dependency>
<!-- AspectJ Tools -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>${org.aspectj-version}</version>
</dependency>

- applicationContext.xml파일에 AOP 추가하기
namespaces에 체크

- applicationContext.xml 에 횡단관심 메서드를 가진 객체 bean만들기


- 메서드마다 before가 적용된 것을 확인할 수 있다.


3. AOP 용어 및 기본설정
- 조인포인트 (JoinPoint) :
클라이언트가 호출하는 모든 비즈니스 메서드
'포인트컷 대상','포인트컷 후보' 라고도한다.
클래스의 모든메서드를 조인포인트라고 생각하면 된다.
- 포인트컷 (PointCut) :
필터링된 조인포인트
원하는 특정 메서드에서만 횡단관심에 해당하는 공통기능을 수행시키기 위해서 포인트 컷이 필요
expression 속성의 값을 어떻게 설정하느냐에따라 필터링되는 메서드가 달라진다.


- 어드바이스 (Advice) :
동작시점을 'before' 'after' 'after-returning' 'after-throwing' 'around' 등 다섯가지로 지정할 수 있다.
- 위빙(Weaving) :
포인트컷으로 지정한 핵심 관심 메서드가 호출될 떄, 어드바이스에 해당하는 횡단 관심 메서드가 삽입되는 과정
위빙을 통해서 비즈니스 메서드를 수정하지 않고 횡단관심에 해당하는 기능을 추가하거나 변경가능
- 애스팩트 (Aspect) 또는 어드바이저 (Advisor) :
애스팩트는 포인트컷 + 어드바이스
어떤 포인트컷 메서드에 어떤 어드바이스 메서드를 실행할지 결정한다.

트랜잭션 설정에는 <aop:advisor>를 사용한다.
- 사용자는 시스템을 사용하면서 비즈니스 컴포넌트의 여러 '조인포인트' 를 호출하게 된다.
이때 특정 '포인트컷'으로 지정한 메서드가 호출되는순간
'어드바이스'객체의 '어드바이스 메서드'가 실행된다.
'포인트컷'으로 지정한 메서드가 호출될 때, '어드바이스 메서드'를 삽입하도록 하는 설정을 '애스팩트'라고한다.
'애스팩트'설정에 따라 '위빙'이 처리된다.
4. 포인트컷 표현식
- '*' : 모든 리턴타입 허용
- 리턴타입이 : void인 메서드 허용
- 리턴타입이 : void가 아닌 메서드 선택
- com.springbook.biz : 정확하게 해당 패키지만 선택
- com.springbook.biz.. : com.springbook.biz로 시작하는 모든 패키지 선택
- com.springbook.biz..impl : com.springbook.biz로 시작하는 모든 패키지중 끝이 impl인 패키지
- BoardServiceImpl : 정확하게 해당 클래스만 선택
- *Impl : 클래스 이름이 Impl로 끝나는 클래스만 선택
- BoardService+ : 해당 클래스로부터 파생된 모든 자식 클래스 선택, 인터페이스 뒤에 '+'가 붙으면 해당 인터페이스를 구현한 모든 클래스 선택
- *(..) : 가장 기본설정으로 모든 메서드 선택
- get*(..) : 메서드 이름이 get으로 시작하는 모든 메서드 선택
- (..) : 매개변수의 개수와 타입에 제약이 없음
- (*) : 반드시 1개의 매개변수를 가지는 메서드만 선택
- (com.springbook.user.UserVO) : 매개변수로 UserVO를 가지는 메서드만 선택
- (!com.springbook.user.UserVO) : 매개변수로 UserVO를 가지지 않는 메서드만 선택
- (Integer,..) : 한개이상의 변수, 첫번째 매개변수 타입이 Integer
- (Integer,*) : 반드시 두개의 매개변수, 첫번째 변수 타입이 Integer
5. 어드바이스 동작 시점


5-1. Before 어드바이스
- 포인트컷으로 지정된 메서드 호출시, 메서드가 실행되기 전에 처리될 내용
5-2. After-Returning 어드바이스
- 포인트컥으로 지정된 메서드가 정상적으로 실행되고 나서, 메서드 수행결과로 생성된 데이터를 '리턴'하는 시점에 동작
- '리턴'하는 시점에 동작하기때문에 포인트컷 메서드에 리턴이 있어야함.
5-3. After-throwing 어드바이스
- catch 예외가 발생하면 수행

5-4. After 어드바이스 (무조건 수행)
- 예외 발생여부와 관계없이 무조건 수행

- 이렇게 에러가 발생해도 실행이 된다.
5-5. Around 어드바이스
- 메서드 실행 전과 후 모두 동적


6. AOP 활용 및 복습하기
- pom.xml
<!-- AspectJ -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
<!-- AOP를 위한 추가 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.8</version>
</dependency>
- applicationContext.xml

- Client 파일에서 Container객체 생성하고 사용준비
AbstractApplicationContext container = new GenericXmlApplicationContext("applicationContext.xml");
container.close();
-
AOP설정에 사용할 메서드 만들기

-
Service 메서드 만들기

-
applicationContext에서 스캐너를통해 Service 객체 생성 후 실행할 수 있도록 설정
public class AOPClient {
public static void main(String[] args) {
AbstractApplicationContext container = new GenericXmlApplicationContext("applicationContext.xml");
container.close();
}
}

-
AOP설정하기

-
결과화면
