본문 바로가기
프로그래밍/Java

Spring AOP(Aspect Oriented Programming)

by Mr-후 2018. 12. 21.
반응형

Spring AOP(Aspect Oriented Programming)


Aspect Oriented Programming은 문제를 바라보는 관점을 기준으로 프로그래밍하는 기법, 문제를 해결하기 위한 핵심 관심 사항과 전체에 적용되는 공통 관심 사항을 기준으로 프로그래밍 함으로써 공통 모듈을 여러 코드에 쉽게 적용할 수 있도록 지원한다. 

기본적인 개념은 공통 관심 사항을 구현한 코드를 핵심 로직을 구현한 코드 안에 삽입한다는 것이다. 

AOP기법에서는 핵심 로직을 구현한 코드에서 공통 기능을 직접적으로 호출하지 않고 핵심 로직을 구현한 코드를 컴파일 하거나, 컴파일 된 클래스를 로딩하거나, 또는 로딩한 클래스의 객체를 생성할 때 AOP가 적용되어 핵심 로직 구현 코드 안에 공통 기능이 삽입된다. 

AOP 프로그래밍에서는 AOP 라이브러리가 공통 기능을 알맞게 삽입해주기 때문에, 개발자는 핵심 로직을 구현할 때 트랜잭션 적용이나 보안 검사와 같은 공통 기능을 처리하기 위한 코드를 핵심 로직 코드에 삽입할 필요가 없다. 핵심 로직을 구현한 코드에 공통 기능 관련 코드가 포함되어 있지 않기 때문에 적용해야할 공통 기능이 변경되더라도 핵심 로직을 구현한 코드를 변경할 필요가 없다. 단지, 공통 기능 코드를 변경한 뒤핵심 로직 구현 코드에 적용만 하면 된다. 


AOP용어. 

Advice : 언제 공통 관심 기능을 로직에 적용할 지를 정의하고 있다. 예를 들어, '메서드를 호출하기 전'(언제)에 '트랜잭션을 시작한다.'(공통기능) 기능을 적용한다는 것을 정의하고 있다. 

Joinpoint : Advice를 적용 가능한 지점을 의미한다. 메서드 호출, 필드 값 변경 등이 Joinpoint에 해당한다. 

Pointcut : Joinpoint의 부분 집합으로서 실제로 Advice가 적용되는 Joinpoint를 나타낸다. 스프링에서는 정규 표현식이나 AspectJ의 문법을 이용하여 Pointcut을 정의할 수 있다. 

Weaving : Advice를 핵심 로직 코드에 적용하는 것을 weaving이라고 한다. 즉, 공통코드를 핵심로직 코드에 삽입하는 것이 weaving이다. 

Aspect : 여러 객체에 공통으로 적용되는 공통 관심 사항을 Aspect라고 한다. 트랜잭션이나 보안 등이 Aspect의 좋은 예이다. 


Weaving방식은 세가지 형태로 나눠지는데 1) 컴파일 시에 Weaving, 2) 클래스 로딩 시에 Weaving, 3) 런타임 시에 Weaving 하기가 있다. 컴파일 시에 코드를 삽입하는 방법은 AspectJ에서 사용하는 방식이고 컴파일 방식에서는 핵심로직을 구현한 자바 소스 코드를 컴파일 할 때에 알맞은 위치에 공통 코드를 삽입한다. 따라서 AOP가 적용된 클래스 파일이 생성되고 컴파일 방식을 제공하는 AOP 도구는 공통 코드를 알맞은 위치에 삽입할 수 있도록 도와 주는 컴파일러나 IDE를 함께 제공한다. 

클래스를 로딩할 때 AOP를 적용하능 방법은 JVM이 클래스를 로딩할 때 클래스 정보를 변경할 수 있는 에이전트를 제공한다. 이 에이전트는 로딩한 클래스의 바이너리 정보를 변경하여 알맞은 위치에 공통 코드를 삽입한 새로운 클래스 바이너리 코드를 사용하도록 한다. 즉, 원본 클래스 파일은 변경하지 않고 클래스를 로딩할 때에 JVM이 변경된 바이트 코드를 사용하도록 함으로써 AOP를 적용한다. AspectJ 5/6버전이 컴파일 방식과 더불어 클래스 로딩 박식을 함께 지원하고 있다. 

런타임시에 AOP를 적용할 때에는 소스 코드나 클래스 정보 자체를 변경하지 않는다. 대신, 프록시를 이용하여 AOP를 적용한다. 프록시 기반의 AOP는 핵심 로직을 구현한 객체에 직접 접근하는 것이 아니라 중간에 프록시를 생성하여 프록시를 통해서 핵심 로직을 구현한 객체에 접근하게 된다. 이때 프록시는 핵심 로직을 실행하기 전 또는 후에 공통 기능을 적용하는 방식으로 AOP를 적용하게 된다. 프록시 기반에서는 메서드가 호출될 때에만 Advice를 적용할 수 있기 때문에 필드 값 변경과 같은 Joinpoint에 대해서는 적용할 수 없는 한계가 있다. 


스프링은 세 가지 방식으로 AOP를 구현할 수 있도록 하고 있다. 

1. XML스키마 기반의 POJO 클래스를 이용한 AOP 구현 

2. AspectJ 5/6에서 정의한 @Aspect 어노테이션 기반의 AOP구현 

3. 스프링 API를 이용한 AOP구현 

어떤 방식을 사용하더라도 내부적으로는 프록시를 이용하여 AOP가 구현되므로 메서드 호출에 대해서만 AOP를 적용할 수 있다는 것에 유의.
(Aspect 5/6에서 정의한 @Aspect 어노테이션을 사용하더라도 메서드 호출과 관련된 Pointcut만 사용 가능하다.)


출처 : 웹개발자를 위한 SPRING 3.0프로그래밍 / 최범균 저



반응형