본문 바로가기

프로그래밍/Spring

[Spring] AOP(Aspect Oriented Programming)

AOP

AOP는 Aspect Oriente Programming의 약자로, 여러 객체에 공통으로 적용할 수 있는 기능을 분리해서 재사용성을 높여주는 프로그래밍 기법이다. AOP는 핵심 기능과 공통 기능의 구현을 분리함으로써 핵심 기능을 구현한 코드의 수정 없이 공통 기능을 적영 할 수 있게 만들어준다. 

 

AOP의 기본 개념은 핵심 기능에 공통 기능을 삽입하는 것이다. 즉 핵심 기능의 코드를 수정하지 않으면서 공통 기능의 구현을 추가하는 것이 AOP이다. 핵심 기능에 공통 기능을 삽입하는 방법에는 다음 세 가지가 있다.

  1. 컴파일 시점에 코드에 공통 기능을 삽입하는 방법
  2. 클래스 로딩 시점에 바이트 코드에 공통 기능을 삽입하는 방법
  3. 런타임에 프록시 객체를 생성해서 공통 기능을 삽입하는 방법

첫 번째 방법은 AOP 개발 도구가 소스 코드를 컴파일 하기 전에 공통 구현 코드를 소스에 삽입하는 방식으로 동작한다. 두 번째 방법은 클래스를 로딩할 때 바이트 코드에 공통 기능을 클래스에 삽입하는 방식으로 동작한다. 이 두가지는 스프링 AOP에서는 지원하지 않으며 AspectJ와 같이 AOP 전용 도구를 사용해서 적용할 수 있다.

 

스프링이 제공하는 AOP 방식은 프록시를 이용한 세 번째 방식이다. 두 번째 방식을 일부 지원하지만 널리 사용되는 방법은 프록시를 이용한 방식이다. 프록시 방식은 중간에 프록시 객체를 생성한다. 그리고 실제 객체의 기능을 실행하기 전/후에 공통 기능을 호출한다.

 

AOP 주요 용어

용어 의미
Advice 언제 공통 관심 기능을 핵심 로직에 적용할 지를 정의하고 있다. 예를 들어 '메서드를 호출하기 전'(언제)에 '트랜잭션 시작'(공통 기능) 기능을 적용한다는 것을 정의한다.
Joinpoint Advice를 적용 가능한 지점을 의미한다. 메서드 호출, 필드 값 변경 등이 Jointpoint에 해당한다. 스프링은 프록시를 이용해서 AOP를 구현하기 때문에 메서드 호출에 대한 jointpoint만 지원한다.
Pointcut Jointpoint의 부분 집합으로서 실제 Advice가 적용되는 Jointpoint를 나타낸다. 스프링에서는 정규 표현식이나 AspectJ의 문법을 이용하여 Pointciut을 정의할 수 있다.
Weaving Advice를 핵심 로직 코드에 적용하는 것을 weaving이라고 한다.
Aspect 여러 객체에 공통으로 적용되는 기능을 Aspect라고 한다. 트랜잭션이나 보안 등이 Aspect의 좋은 예이다.

 

스프링에서 구현 가능한 Advice 종류

종류 설명
Before Advice 대상 객체의 메서드 호출 전에 공통 기능을 실행한다.
After Returing Advice 대상 객체의 메서드가 익셉션 없이 실행된 이후에 공통 기능을 실행한다.
After Throwing Advice 대상 객체의 메서드를 실행하는 도중 익셉션이 발생한 경우에 공통 기능을 실행한다.
After Advice 익셉션 발생 여부에 상관없이 대상 객체의 메서드 실행 후 공통 기능을 실행한다.(try-catch-finally의 finally 블록과 비슷하다.)
Around Advice 대상 객체의 메서드 실행 전, 후 또는 익셉션 발생 시점에 공통 기능을 실행하는데 사용된다.

 

 

출처: www.yes24.com/Product/Goods/62268795

 

스프링5 프로그래밍 입문

스프링 프레임워크의 버전업으로 개선된 내용을 담았다. 처음 스프링을 배우고자 하는 독자들이 입문할 때 필요한 것은 스프링의 방대한 내용이 아닌 기초와 전반적인 흐름을 잡아주는 것으로

www.yes24.com

 

'프로그래밍 > Spring' 카테고리의 다른 글

[SPRING] 스프링 웹 개발 기초  (2) 2022.09.20
[SPRING] 프로젝트 환경설정  (0) 2022.09.18
[spring] 빈 라이프사이클과 범위  (0) 2021.04.15
[spring] 컴포넌트 스캔  (0) 2021.04.12
[spring] 의존 자동 주입  (0) 2021.04.12