[Spring] AOP(Aspect Oriented Programming), 관점지향 프로그래밍의 이해

|

 관점지향 프로그래밍.


정말 지친다, 지쳐.

왜 이렇게 용어를 어렵게 만들어놨는지..;

각설하고

관점지향 프로그래밍 역시 별거 아니였다(라고 말할 수 있는 입장은 아니지만;)

나같은 초보 분들께 드리고 싶은 말은.. 용어의 압박감으로부터 벗어나라!(머 이런 뜻이였음.)


관점을 지향한다... 여기서 관점은.. 스프링에서의 관점은 글쎄... 시점이라는 표현이 더 적절치 않나 싶다.

어떤 '시점'에서 Aspect들이 실행되야 하는지가 중요한 관건인것 같아서이다.

(관점이라는 말은 보편적으로 '사물을 보는 시각' 따위로 쓰이는데 관점지향.. 이해만 어려워진것 같다.)

에스펙트는 '스프링인액션'의 번역본에 따르면 횡단 관심사의 기능이라고 되어있다...

(정말... 용어들이 갈수록 과관이다..횡단;; 관심사라;;;)


요점 부터 말하자면;;; AOP는 개발자가 비즈니스 로직에만 집중할 수 있도록

기타 시스템에 관한 서비스(로깅이나 트랜잭션 관리)들을 분리해 놓는 것이다.

즉, 여러 영역에서 '중복'될 수 있는 시스템 관련 코드들을 한곳에서 관리하여 중복도 줄이고

더이상 로직구현이 아닌 부분에 대해서는 개발자가 신경을 쓰지 않도록 하는 것이 취지이다.

(정말 필요하다. 웹 플밍으로 전향하고서 느낀 점인데.. 이 쪽은,

실제 프로그래밍 보다 '기타등등(계층간 설정, 버전 궁합 등)'들에 더 많이 신경써야하는 것 같다..)


다시 쉽게 말해서 로깅 같은 것들을 따로 로그 클래스로 만들어서,

메소드의 시작 전에 호출을 할지 메소드 후에 실행시킬지,

아니면 두번 다 실행시킬지 등등을 xml 설정으로 쉽게 관리 할 수 있게 해주는 것이다.. IoC 개념으로 말이다.

(그래서 시점지향이라고 하는게 맞지 않나..싶다. 왜 관점이어야 하는지 아시는 분은 답글 부탁드림.)


(다음은 AOP관련 용어 설명)

여기에서  로깅(로그를 하는 행위, 기능)이 aspect이고 로그 클래스(실제 구현물)가 advice(충고)이다.

그리고 '애스펙트'를 집어넣을 수 있는 지점들, 즉 메소드, 예외 등이 joinpoint(결합점)가 되고,

실제로 '결합점' 중에서 한 곳에 '충고'를 적용시키면, 그곳이 pointcut(교차점)이 된다.

target(대상)이란 '충고'를 받는 클래스, 즉 pointcut을 포함하는 클래스를 '충고'의 target이라고 말하고

proxy(프록시)는 '대상' 객체에 '충고'가 적용된 후 생성되는 객체를 말한다.

또한 기존의 클래스에 새로운 메소드나 속성을 추가할 수 도 있는데 이는 introduction(도입)이라 부른다.

weaving(엮기)는 애스펙트를 타겟에 적용하여 새로운 프록시 객체를 생성하는 과정이다.

이 '엮기'는 런타임시 어떤 시점에 '엮이게' 하는 것이 일반적이고,

컴파일시, 클래스 로딩시에 '엮을' 수도 있는데 이런 경우 각각 특수 컴파일러와 특수 ClassLoader가 필요하다.

 (헥헥..)


그렇다면 cross-cutting concern(횡단 관심사)란 무엇이냐.. 다음 그림이 크로스 커팅 컨썬이다.-_-

(여기서 또 횡단 관심사의 '관심사'가 왜 '관심사'여야 하는지 모르겠다. 그냥  횡단 기능 등이라고 했으면 이해가 더 쉬웠을텐데..

초짜들에게 혼란만 가중시키는 잘못된 역이 아닌가 싶다. 너무 직역을 해야한다는 압박감을 가진 모양이다. 역자님께서..

혹시 '관심사' 여야 하는 이유를 아시는 분은-_- 댓글부탁.)


사용자 삽입 이미지


코스와 학생, Misc(??) 의 각각의 영역에서 모듈들이 서비스를 제공할때,

이 모듈들은 보안기능 또는 트랜잭션등을 포함하고 있다 치면,

이런 것들은 공통적으로 사용되는 기능들일 것이다.

이론 공통적인 부분을 재사용하기 위해 일반적인 객체 지향 기법으로는 상속이나 위임으로 해결할 수 있는데,

상속을 하게 되면, 객체의 계층도가 무너지고,

(생각해보라. 다이어그램을 그리는데 전혀 관계없는 객체들이 곳곳에서 한 클래스를 상속하면..;)

 위임을 사용하면 번거로워 지며, 위임한 객체에 대한 중복 호출을 필요로 한다.

그래서 AOP를 사용하는 것이다.

AOP를 적용하면 공통 기능을 한 곳에서 정의할 수 있고 그런 기능을 어디에 어떻게 적용할 것인지를 선언적으로 정의할 수 있다.



이 글은 스프링노트에서 작성되었습니다.

And