본문으로 바로가기

[스프링/Spring] AOP 개념 설명

category Spring 스프링 2018. 4. 16. 15:48
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


Spring 핵심 기능 AOP에 대해서


AOP란 ?


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


AOP의 기본 개념은 핵심 기능에 공통 기능을 삽입하는 것입니다. 즉 핵심 기능의 코드를 수정하지 않으면서 공통 기능의 구현을 추가하는 것이 AOP입니다.  AOP의 공통 기능을 Aspect라고 하는데, Aspect 외에 알아두어야 할 용어를 정리하자면 아래의 표와 같습니다.



 용어

 의미 

 Joinpoint 

 Advice를 적용 가능한 지점을 의미합니다. 메서드 호출, 필드 값 변경 등이 JoinPoint에 해당하며, 스프링은 프록시를 이용해서 AOP를 구현하기 때문에 메서드 호출에 대한 Joinpoint만 지원합니다. 

 PointCut 

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

 Advice 

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

 Weaving 

 Advice를 핵심 로직 코드에 적용하는 것을 weaving 이라고 합니다. 

 Aspect 

 여러 객체에 공통으로 적용되는 기능을 Aspect라고 합니다. 트랜잭션이나 보안 등이 Aspect의 좋은 예입니다. 





한 번만 읽어보고 넘기세요. 직접 코드 짜봐야지 어디가 Pointcut, Jointpoint, Weaving 개념이 잡힐 것같습니다. 전 그랬습니다..




Advice의 종류

스프링은 프록시를 이용해서 메서드 호출 시점에 Aspect를 적용하기 때문에 구현 가능한 Advice의 종류는 아래의 표와 같습니다.


  종류

 설명 

 Before Advice

 대상 객체의 메서드 호출 전에 공통 기능을 수행한다. 

 After Returining Advice 

 대상 객체의 메서드가 익셉션 없이 실행된 이후에 공통 기능을 실행한다. 

 After Throwing Advice 

 대상 객체의 메서드를 실행하는 도중 익셉션이 발생한 경우에 공통 기능을 실행한다. 

 After Advice 

 대상 객체의 메서드를 실행하는 도중에 익셉션이 발생했는지의 여부에 상관없이 메서드 실행 후 공통 기능을 실행한다. (try, catch, finally 의 블록과 비슷하다.) 

 Around Advice 

 대상 객체의 메서드 실행 전, 후 또는 익셉션 발생 시점에 공통 기능을 실행하는데 사용된다. 


이들 AOP중에서 널리 사용되는 것은 Around Advice 인데 그 이유는 대상 객체의 메서드를 실행하기 전/ 후, 익셉션 발생 시점 등 다양한 시점에 원하는 기능을 삽입할 수 있기 때문이다. 이런 이유로 캐시 기능, 성능 모니터링 기능과 같은 Aspect를 구현할 때에는 Around Advice를 주로 이용하게 됩니다.


스프링 AOP 구현

스프링 AOP를 이용해서 공통 기능을 구현하고 적용하는 방법은 다음과 같습니다.

1. 공통 기능을 제공하는 Aspect를 구현한다.

2. Aspect를 어디(Point cut)에 적용할지 설정한다. 즉, Advice를 설정한다.


스프링 AOP 구현 방법 2가지

개발자는 공통 기능을 제공하는 Aspect 구현 클래스를 만들고, XMl이나 자바 설정을 이용해서 Aspect를 어디에 적용할지 설정하면 됩니다. Aspect를 구현하는 방법에는 1. XML 스키마 기반의 자바 POJO 클래스를 이용하는 방법. 2. @Aspect 애노테이션을 이용하는 방법 두 가지가 있습니다.


AOP 개발 준비

pom.xml에 aspectjweaver 의존 추가 하기.

        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.2</version>
        </dependency>
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>2.2</version>
        </dependency>



POJO 클래스란 ?

POJO는 Plain old java object의 약자로서, 순수한 자바 객체를 의미합니다. 스프링이 출현하기 이전에 EJB라는 기술이 유행할 당시에는 EJB에 정의된 인터페이스나 클래스를 상속받은 코드를 작성해야만 했습니다. 즉 특정 기술에 종속된 코드를 만들어야 했는데 이에 대한 반대되는 개념으로 EJB 출현 이전의 특정 기술에 종속되지 않은 자바 객체라는 의미로 POJO라는 용어를 사용하기 시작했습니다.


샘플 코드 및 설명

1. XML 스키마 기반의 AOP

2. @Aspect 어노테이션을 사용한 AOP