[책]토비의스프링_6장_AOP

스프링 AOP

애플리케이션의 핵심적인 기능에서 부가적인 기능을 분리해서 애스펙트라는 독특한 모듈로 만들어서
설계하고 개발하는 방법을 애스펙트 지향 프로그래밍 
또는 약자로 AOP(Aspect Oriented Programming)이라고 한다.
( => 관점 지향 프로그래밍)

AOP는 OOP를 돕는 보조적인 기술이지 OOP를 완전히 대체하는 새로운 개념이 아니다.

AOP는 결국 애플리케이션을 다양한 측면에서 독립적으로 모델링하고
설계하고 개발할  있도록 만들어주는 것이다.

AOP를 이용해 트랜잭션 속성을 지정하는 방법에는 포인트컷 표현식과 메소드 이름 패턴을
이용하는 방법과 타깃에 직접 부여하는 @Transactional 어노테이션을 이용하는 방법이 있다.

@Transactioanl을 이용한 트랜잭션 속성을 테스트에 적용하면 
쉽게 DB를 사용하는 코드의 테스트를 만들  있다.

스프링 AOP 어노테이션

@Aspect, @Component
해당 클래스가 Aspect를 나타내는 클래스를 명시하고, 
스프링 빈으로 등록하기 위해 @Component 어노테이션을 명시

@Pointcut(포인트컷 표현식)
포인트컷은 위에서 부가기능이 적용될 대상(메소드) 선정하는 방법

@Before
타겟 메소드가 실행하기 이전 어드바이스 기능을 수행

@After
타겟 메도스의 결과에 상관없이 실행  어드바이스 기능을 수행

@AfterReturning
타겟 메소드가 정상적으로 결과값을 반환  어드바이스 기능을 수행

@AfterThrowing
타겟 메소드가 수행  예외를 발생하면 어드바이스 기능을 수행

@Around
어드바이스가 타겟 메소드를 감싸서 타겟 메소드 호출전, 어드바이스 기능을 수행
Around는 타겟을 실행할  혹은 바로 반환할지도 정할  있음

정리

관점 지향 프로그래밍(AOP) 기능을 구현할때 핵심적인 기능과 부가적인 기능을 분리하여
 관점을 기준으로 모듈화하는 방식

핵심적인 기능 : 비즈니스 로직
부가적인 기능 : 데이터베이스 연결&트랜잭션 관리 , 로깅, 파일 입출력

은행 애플리케이션을 관심사라는 관점으로 표현한 구조

A             B             C
계좌이체       입출금         이자계산  < --- 비즈니스 로직
로깅          로깅           로깅     
트랜잭션       트랜잭션        트랜잭션
보안          보안           보안

로깅, 트랜잭션, 보안은 횡단 관심사라고 한다.
횡단 관심사의 분리를 허용함으로써 모듈성을 증가시키는 것이 목적.