[SPRING] 4-1. AOP (Aspect Oriented Programming) 이해하기
이번 챕터4 에서 살펴 볼 내용은 AOP에 관한 내용입니다.
AOP란 Aspect Oriented Programming 으로써 여러 클래스로 분산된 책임(기능)을 별도의 관점으로 분리/캡슐화 하는 프로그래밍 방법입니다. 관점지향적 프로그래밍이란 공통의 관심사항을 분리하는 것, 핵심기능과 부가기능을 분리하고 OOP를 대체하는 것이 아니라 보완하기 위한 것입니다. AOP는 DB 준비와 해제 / 반환 작업과 메소드 마다 반복되는 작업에서 필요하게됩니다.
코드를 살펴보면 SQL을 처리하는 부분보다 반복되는 코드의 양이 더 많은것을 알 수 있습니다.
이런 반복된 코드를 AOP를 이용해서 여러 클래스로 분산된 책임(기능)을 별도의 관점으로 분리/캡슐화 하는 프로그래밍 방법으로 분리해 줄 수 있습니다. 메소드의 시작과 끝에 시각을 나타내어 메소드의 실행시간을 살펴볼 수 있습니다.
메소드의 시작과 끝에 시각을 나타내어 메소드의 실행시간을 살펴볼 수 있습니다. 메소드의 효율을 확인할 수 있습니다.
클래스를 넘어서 메소드를 넘어서 공통적인 부분을 분리할 수 있습니다. 이것을 횡단 관심사 라고합니다. Transaction을 AOP로 관리할 수 있습니다. 일반적인 관점에서 생각하면 트랜잭션을 이루고 있는 단위업무 중 하나라도 실패하면 그것이 취소가 되도록 service에서 트랜잭션을 관리 할 것입니다. 예를들어 insert가 두 번 되는 것 과같은것을 관리할 수 있습니다.
AOP는 class에서 핵심기능과 부가기능이 혼재한것을 OOP에서는 핵심기능과 부가기능을 분리하기 어렵기때문에 AOP가 OOP를 보완하여 사용됩니다. AOP는 OOP를 대체하는 개념이 아닌 보완 하는 개념입니다.
AOP에 관련된 용어를 살펴보겠습니다. Aspect는 여러 객체에 공통으로 적용되는 관심사항을 말합니다. Advice는 공통 관심 기능을 언제 핵심 로직에 적용할지 정의하는 것이며 JoinPoint는 Advice 가 적용될 시점/지점(메소드)을 말합니다. pointCut은 Adive가 적용되는 joinpoint의 부분이며 외에도 Weaving, Advisor, Proxy가 있습니다. 인터셉터나 필터는 레이어의 개념으로 컨트롤러에 영향을 가하지 않습니다. AOP는 실제 로직과 관련되어 있습니다. 메소드 내의 로직 전 후로 실행됩니다. aop-aspectj 라이브러리가 삽입해줍니다. class A에 공통코드가 삽입된 것을 proxy A라고 합니다.
AOP에서 Adivce란 언제 공통 관심 기능을 핵심 로직에 적용할지 정의 하는것을 뜻합니다. Before Advice는 대상 객체의 메소드 호출 전에 공통 기능을 실행하는 것이며, After Running Advice는 대상 객체의 메소드가 예외 없이 실행된 이후에 공통 기능을 실행하며 After Throwing Advice는 대상 객체의 메소드를 실행하는 도중 예외발생시 공통 기능을 실행하는 것입니다. After Advice는 대상 객체의 메서드 실행 후 공통 기능을 실행하며 Around Advice는 대상 객체의 메소드 실행 전, 후 또는 예외 발생 시점에 공통 기능을 실행하는 것입니다.
AOP에서의 pointcut은 Advice가 적용되는 joinpoint부분을 말합니다. @Pointcut을 이용하여 나타낼수 있습니다.
pointcut은 다양한 joinpoint의 표현법이 있습니다.