Spring〃스프링 장점 (2) AOP의 구조 + 어노테이션

반응형


스프링프레임워크의 두번째 장점인 AOP(Aspect Oriented Programming)기능을 한번 알아보겠습니다. 


AOP는 관점지향프로그래밍이라 불리며 구글번역기로 돌리면 가로지향프로그래밍이라 뜨는데 가로지향이라 외우시는게 머리속에 기억 남으실겁니다. 밑에서 AOP 구조를 그림으로 설명하게 될텐데 설명전에 왜 관점지향이 아니라 가로지향을 자꾸 언급하는지 아시게 될거에요.


먼저 AOP 기능을 스프링에서 지원하는게 왜 장점일까요?? 제 나름대로 한가지를 예로 들어 보겠습니다. 은행과 같이 보안이 1순위인곳에서 프로그램을 짜는데 각 클래스파일마다 보안기능을 넣을라면 얼마나 귀찮을지 상상이 됩니다. 물론 꼭 넣어야 할 곳만 몇개 추가한다면 상관없겠지만 보안기능만을 갖추고 있는 모듈을 하나 만들어 공통적으로 적용시킨다면 엄청 편리하겠죠.


정리하자면 기능을 핵심 비지니스 로직과 공통 모듈로 구분하고, 핵심 로직에 영향을 미치지 않고 사이 사이에 공통 모듈을 효과적으로 잘 끼워넣도록 하는 개발 방법입니다. 




AOP의 구조


AOP를 그림으로 표현하자면 이런식의 구조를 가지고 있습니다. 모듈을 가로로 나열하고 공통으로 적용시킬 기능들이 세로로 관통하고 지나가는 모습이죠. 계속 가로지향이라고 이야기했던 부분이 그림을 보면 이해가 됩니다. 보안기능을 따로 만들어 놓고 적용시켜야야 하는 모듈1, 모듈2, 모듈3을 위와 같이 한번에 처리한다고 생각하시면 되겠습니다.   




 AOP의 세분화된 구조 + 용어정리



구조를 용어정리와 같이 해석 하면서 Aspect를 보안기능으로 적용하여 예로 들겠습니다. 


AspectAOP에서 관점이라 부르며 여러 객체에 공통으로 적용되는 기능을 담당합니다. 보안기능 / 로깅기능 / DB처리기능들이 이에 해당합니다.

● Advice : Aspect(이하 보안기능)이 적용할 조건을 담당합니다. 보안기능이 어떤 메소드 전에 동작할지, 예외발생후 동작할건지 조건을 걸어주는거죠.

● Pointcut: 보안기능(공통으로 적용될 기능)을 모듈의 Joinpoint 어디를 통과할건지 위치를 지정하는 역활입니다.

● Weaving: 어떤 Advice를 어떤 Pointcut에 사용할지 설정하는 역활입니다.

● Joinpoint: 보안기능이 적용 가능한 포인트들입니다. 

● Target: 여러개의 Joinpoint중 보안기능이 적용되는 포인트를 Target이라 합니다.

● Proxy: 보안기능 절차가 다 적용이되면 Proxy라는 객체가 나오는데 Advice(적용할 조건)과 Target(보안기능이 적용된 포인트)가 구성되어 있습니다.  






 AOP 구현방법



1. POJO 클래스를 이용한 구현

2. 스프링 API를 이용한 구현

3. @Aspect 어노테이션을 이용한 구현


AOP를 구현하기 위한 방법은 3가지로 알고 있습니다. 3가지 전부 다 알면 좋겠지만 초보자의 입장에서는 전부 외우기 힘든 파트이니 대부분 많이 쓰고있는 어노테이션에 대해서만 정리하고 넘어가려고 합니다. 한가지만 제대로 파보겠습니다.!!





 @Aspect 어노테이션(Annotation) 


이 구현 방법은 설정파일에 따로 Advice(동작이 언제 작동할지 조건)와 Pointcut(조인포인트를 어디에 통과할지 정해주는 조건)을 따로 설정하지 않아도 자동으로 Advice가 적용됩니다. 그리고 AOP를 하기 위해서 환경설정에 꼭 <aop:aspectj-autoproxy />를 추가로 설정해야 하는데 어떤 작업을 하든


 ApplicationContext.xml 환경 설정


항상 까먹지않고 먼저 환경설정을 하는 습관을 가져야 합니다. Spring의 환경설정은 ApplicationContext.xml파일에 설정하고, WEB-INF폴더 바로 내부에 만들어야 됩니다. 빨간 네모칸을 제외한 스키마들은 스프링 프레임워크를 사용하기 위한 저만의 기본설정입니다. 각자 기본설정에 빨간 네모칸에있는 명령어들을 추가해주시면 AOP를 사용하기 위한 준비가 다 되겠네요.




 어노테이션 Advice(조건)설정 태그


여기서 다시 설명하자면 " pointcut "은 공통기능인 Aspect가 적용될 곳을 지정하는 태그입니다. 또한 @Around를 제외한 나머지 메소드는 첫 pointcut에 Joinpoint를 가질 수 있습니다. 다시 말하면 @Around는 처음 Advice에 Joinpoint를 쓸 수 없다는 이야기죠.


@ Aspect Aspect 클래스임을 선언.


@ Before ("pointcut") → 메소드가 동작하기 전에 실행할 Advice(조건)을 지정한다.


@ After ("pointcut") → 메소드가 정상 실행 or 예외 발생 상관없이 동작하고 난 후 실행할 Advice(조건)을 지정한다.


@ AfterReturning (pointcut=" " , returning = " " ) → 메소드가 정살 실행하면 전달받을 리턴값 Advice(조건)를 지정한다.


@ AfterThrowing (pointcut=" " , throwing = " " ) → 예외가 발생하면 실행되는 Advice(조건)을 지정한다.


@ Around ("pointcut") → 모든시점에서 적용시킬 수 있는 Advice(조건)을 지정한다. 

※ Around는 ProceedingJointPoint.proceed( ) 메소드를 pointcut에 넣어 프록시(Proxy)의 메소드를 호출할 수 있다.



 각 클래스마다 어떤 어노테이션을 써야되나??

DAO는 @Repository 선언 / Controller는 서블릿이 역활을 담당하며 @Controller로 선언 / Service는 @service로 선언합니다.

반응형