오늘
AOP = Aspect-Oriented Programming / 즉 관점 지향 프로그래밍이라는 뜻.
지난번 2/2일 블로그에 DI와 함께 작성했었다.
그래도 한번 더 보고 넘어가자.
애플리케이션 로직은 두가지로 나눠서 볼 수 있다.
핵심 기능(Core Concerns) : 업무 로직을 포함하는 기능
부가 기능(CROSS-CUTTING CONCERNS) : 핵심 기능을 도와주는 부가적인 기능
Aspect
실제로 우리가 만들 부가기능을 말한다. (어드바이스, 포인트 컷이 합쳐진 것.)
그리고 @Slf4j는 아직 안배웠지만 로그를 남기기 위한 모듈이라고 한다.
@Around ("execution(* start.aop.order..*(..))")
는 start.aop.order.. 패키지와 하위 패키지를 지정한 것. 포인트 컷이 된다.
@Around의 메서드인 loggin은 어드바이스가 된다.
order 패키지에는 이렇게 있는데 OrderService와 OrderRepository의 모든 메서드는 AOP 적용 대상이 된다. 아까 포인트 컷을 지정해줌으로써.
포인트 컷 : 부가기능을 어디에 지정할 것 인지.
조인포인트 : 어드바이스가 적용 될 위치
어드바이스 : 부가 기능. 그 자체.
AOP로 사용하려면 반드시 spring bean으로 등록되어 있어야 함.
아까 만든 Aspect1 클래스를 Import를 통해 bean으로 등록.
결과화면
아까는 @Around를 이용해서 포인트컷을 넣었지만 @Pointcut을 이용해서 분리 할 수도 있다.
private & public 등의 접근 제어자는 내부에서만 사용하면 private, 다른 애스펙트에서 참고하면 public으로 사용하면 된다.
@Pointcut를 이용해 위치를 정해주고 allOrder에 넣어주고 있다. 그리고 @Around에서 allOrder라고 지정해주고 있다.
allService 포인트컷은 타입, 이름, 패턴이 Service를 대상으로 하는데 이름이 Service로 끝나는 것을 대상으로 한다. (타입, 이름, 패턴 이란 클래스 인터페이스 모두 적용된다는 뜻)
로그 출력 기능에 추가로 트랜잭션이 동작하는 것처럼 로그 남기는 기능을 추가.
과정
핵심 로직 실행 직전에 트랜잭션 동작. -> 핵심로직 실행 -> 핵심로직 문제 없으면 커밋 or 예외 있으면 롤백.
실행 결과
포인트컷을 공용으로 사용하기 위해 외부 클래스로 외부에 모아 둘 수 있음.
포인트컷을 여러 어드바이스에 험께 사용할 때 이 방법을 사용하면 된다.
test파일은 test 패키지에 넣어야한다!
Advice = 순서 보장 안됨.
@Around
@Before
@AfterRunning
@AfterThrowing
@After
조인 포인트 실행 이전에 실행.
Before Advice 구현한 메서드는 일반적으로 리턴타입 void.
작업 흐름 변경 못함
메서드 종료 시 자동으로 다음 타켓 호출. (예외 발생시 다음 코드 호출 안됨.)
조인 포인트가 정상 완료 후 실행
메서드가 예외 없이 실행 된 이후 공통 기능 실행.