본문 바로가기

공부 기록/Spring

[Spring] AOP

AOP(Aspect Oriented Programming)

- 관점 지향 프로그래밍

- 관점 지향 => 핵심적인 관점, 부가적인 관점으로 나누어서 그 관점을 기준으로 각각 모듈화한다.

  

MVC 웹 어플리케이션에서는 대부분 Web Layer, Business Layer, Data Layer로 정의된다.

- Web layer : REST API를 제공, 클라이언트 중심의 로직 적용

- Business layer : 내부 정책에 따른 로직 개발

- Data layer : DB 및 외부와의 연동 처리

  

- 특정한 함수 호출 전이나 후에 공통적인 처리가 필요할 때 유용하다. => 로깅, 트랜잭션, 인증

- OOP로 처리하기에는 다소 까다로운 부분을 AOP를 도입하여 공통 기능을 쉽게 추가/수정/삭제할 수 있도록 한다.

- 실무에서는 코드 분석이 어려워질 가능성이 있어 보수적으로 도입하는 편(적극적으로 도입하기보다 꼭 필요한 경우에만 사용)

주요 키워드

Aspect : 여러 클래스나 기능에 걸쳐 있는 관심사, 그리고 그것들을 모듈화함

Advice : AOP에서 실제로 적용하는 기능

Join Point : 모듈화된 특정 기능이 실행될 수 있는 연결 포인트

Pointcut : Join point 중에서 해당 Aspect를 적용할 대상을 뽑을 조건식

Target Object : Advice가 적용될 대상 오브젝트

AOP Proxy : 대상 오브젝트에 Aspect를 적용하는 경우, Advice를 덧붙이기 위해 하는 작업, 주로 CGLIB(Code Generation Library, 실행 중에 실시간으로 코드를 생성하는 라이브러리) 프록시를 사용하여 프록싱 처리를 한다.

Weaving : Advice를 비즈니스 로직 코드에 삽입하는 것

흩어진 관심사(Crosscutting Concerns, 횡단 관심사)

- 중복 코드

- 핵심적인 기능이 아니지만 여러 로직에 중간중간 삽입되어 있는 기능들

- AOP는 흩어진 관심사를 모듈화하고 핵심적인 비즈니스 로직에서 분리하여 재사용한다.

주요 어노테이션

@Aspect : AOP를 정의하는 클래스에 할당

@Pointcut : AOP를 적용시킬 지점 설정

@Before : 메소드 실행 전 실행

@After : 메소드 실행 후 실행(예외가 발생되어도 실행)

@AfterReturing : 메소드 호출 성공 실행 시

@AfterThrowing : 메소드 호출 실패, 예외 발생 시

@Around : Before, After 모두 제어

AspectJ

- AOP를 제대로 사용하기 위해 꼭 필요한 라이브러리

- 기본적으로 제공되는 Spring AOP로는 다양한 기법의 AOP를 사용할 수 없음