Spring/Core

Spring Core - AOP의 개념

kwon92 2020. 4. 18. 17:15

Contents 

  • AOP란?

  • AOP 용어

  • AOP 적용 방법

AOP란?

흩어진 AspectJ를 모듈화 할 수 있는 프로그래밍 기법이다.

 

Spring AOP란?
AOP 의 구현체를 제공하고, Java 의 만들어져있는 AOP 구현체 AspectJ 와 연동해서 사용할 수 있는 기능도 제공하고

스프링 자체에서 구현한 Spring AOP 기능을 활용 할 수 있게 한다.

 

이걸 기반으로 Spring Transaction 이나 여러가지 다른 기능들이 적용이 되고 있다.

캐시기능도 마찬가지

 

여러 클래스에 걸쳐서 사용되는 비슷한 코드들이 있다.

가령, 트랜잭션을 생각해보자

A,B,C 모두 트랜잭션이 필요하다고 했을때

트랜잭션 처리가 어떻게 되냐하면 보통 ,

 

set Auto commit 을 false로 만들고,

query 실행 하고

commit을 하거나 rollback 을 한다.

 

이런 비슷한 코드들로 기존에 서비스 코드들을 감싸야한다고 치자.

근데 이런 각각 적용된 코드들의 변경이 발생하면

적용된 모든 곳을 뒤져가면서 코드를 고쳐야한다

유지보수가 쉽지 않게 된다.

 

그래서 AOP 가 이 문제를 Aspect 를 이용해서 해결을 한다.

Aspect로 흩어진 걸 한 곳에 모은다.

Aspect 안에다가 각 클래스에서 하던 일 들을 독립적으로 작성을 하고

이 코드가 어디 어디에 적용이 되어야 하는지 A,B,C 를 입력을 해준다.

 

이런식으로 해야할 일과, 그게 어디에 적용되어야 하는지를 묶어서

모듈화 하는걸 AOP 라고 한다.

 

 

AOP 의 용어

 

Aspect  -  묶음 , 하나의 모듈

Advice  - 해야할 일들 

point cut - 어디에 적용해야하는지의 정보

target - 적용 대상

join point - 합류점 , 가장 흔하게 쓰는건 메소드 실행시점 -> 실행 할 때 이 어드바이스를 끼어넣어라

            끼어들 수 있는 지점.. 그게 바로 join point

 

AOP 적용 방법

  • 컴파일 시점
  • 로드 타임 시점
  • 런타임 시점

 

 

컴파일 시점

java 파일을 class 파일로 만들 때 바이트 코드에 이미 적용이 되게 해준다.

 

로드 타임

컴파일은 일단 A 라는 클래스는 A라는 클래스만으로 컴파일을 한다.

AOP 적용 없이.

근데, 이 A 라는 클래스를 로딩하는 시점에 ,

JVM 에서 클래스를 로딩하는 시점에 바이트코드를 로드 타임 위빙으로 

advice를 낑겨서 넣는다. 

즉, 바이트 코드는 A 라는 클래스 자체로 있지만 , JVM 안에서는 A 클래스 전에 advice가 같이 있게 로딩 된다.

 

 

런타임 시점

이게 Spring AOP 가 사용하는 방법이다.

A 라는 빈에 Aspect를 적용해야 된다는걸 스프링이 알고 있다.

스프링 컨테이너가 A 라는 빈을 생성할때 ,

A 라는 타입의 Proxy Bean 을 만들고,

A 라는 Bean 을 감싼 A 타입의 Proxy Bean 을 만든다.

이 Proxy Bean 이 실제 A 의 메소드가 실행되기 직전에 

advice 의 일을 하고 A 메소드를 호출 하게 된다.