Old Branch

관점 지향 프로그래밍, AOP(Aspect-oriented programming)

woolbro 2019. 6. 17. 15:47
반응형

Spring을 공부하다가, Spring-AOP 라는 말을 많이 보았습니다.

 

매번 보면서 아는척 하면서 넘어가기도 그렇고....

 

도대체 AOP가 무엇인지 궁금해서 오늘은 AOP에 대해서 공부해 보았습니다.... 


 

AOP (Aspect-Oriented Programming).... Wikipedia - Aspect oriented programming과 여러 구글링을 토대로 공부 해 보았습니다.

 

 

1. 관점 지향 프로그래밍(Aspect - oriented programming)

관점 지향 프로그래밍은 프로그램 로직을 분리된 파트로 변화시키는 것을 의미합니다. 

어플리케이션의 핵심적인 기능에서 부가적인 기능을 분리해서 Aspect 라는 모듈로 만들어서 설계하고 개발하는 방법입니다.

 

AOP는 새로운 프로그래밍 패러다임이 아닌, 객체지향프로그래밍을 돕는 포조적인 기술입니다. 핵심기능 대신, 부가적인 기능을 바라보고 집중해서 설계 및 개발 할 수 있습니다.

 

예를들어, 프로그램 개발 시에 공통되는 기능들 중 가장 대표적인 기능이 로그가 있습니다.

 

공통되는 기능들을 여러 모듈에 적용하기 위한 방법으로는 상속이있습니다. 그러나, 자바에서는 기본적으로 다중 상속을 지원하지 않기 때문에 다양한 모듈에 상속을 통해서 기능을 주는 데에 한계가 있습니다.

 

이러한 한계를 해소 해 주는 방법이 AOP 입니다. 즉, 기능을 핵심 비즈니스 로직과 공통 모듈로 구분하고, 핵심 로직에 영향을 미치지 않고 사이사이에 공통 모듈을 효과적으로 잘 끼워 넣는 방법입니다.

 

1.1 AOP의 예

  1. 간단한 메소드 성능검사 
    • 개발 도중 (DB 특히..)에 다량의 데이터를 넣고 뺴는 등의 작업에 대하여 시간을 측정하고 쿼리를 개선하는 작업은 매우 중요하다. 이를 위해서 매번 메소드 처음과 끝에 System.currentTimeMillis();를 사용하는 것은 매우 번거롭습니다.
    • 해당 작업을 (성능측정, 시간측정...) 코드 밖에서 구현하고 사용하는 편이 편리
  2. 트랜잭션 처리 
    • 트랜잭션 : 데이터베이스의 상태를 변화시키기 위해 수행하는 작업의 단위
    • Select, Insert, Delete, Update......
    • 트랜잭션의 경우 비즈니스 로직의 전후에 설정

등등....

 

1.2 AOP 의 구성요소

조인포인트 (joinpoint) - 모듈의 기능이 삽입되어 동작 할 수 있는 실행 가능한 특정 위치(Aspect가 실행 가능한 위치)

메소드가 호출되는 부분 또는 리턴되는 시점, 필드를 액세스하는 부분, 인스턴트가 만들어지는 지점, 예외가 던져지는 시점, 등등 각각의 joinpoint들은 AOP에 의해 자동으로 추가되어져서 동작 할 수 있는 후보지가 됩니다.

 

포인트컷 (pointcut) - 어떤 클래스의 어느 조인포인트를 사용 할 것인지 결정하는 기능

AOP가 항상 모든 모듈의 모든 조인포인트를 사용할 것이 아니기 떄문에 필요에 따라 사용해야 할 모듈의 특정 조인포인트를 지정 할 필요가 있다. 일종의 조인포인트 선정 룰과 같은 개념입니다.

 

어드바이스(advice)또는 인터셉터(intercepter)

어드바이스 - 조인포인트에 삽입되어져 동작 할 수 있는 코드

(Before advice / After returning advice / After throwing advice / Around advice)

아래는 Spring Documents에서 가져온 글 입니다. 어드바이스의 종류를 표현하고 있습니다.

인터셉터 - 어드바이스의 종류. 주로 한 개의 invoke 메소드를 가지는 어드바이스

 

위빙(weaving) 또는 크로스컷팅(crosscutting)

위빙 - 포인트컷에 의해 결정된 조인포인트에 지정된 어드바이스를 삽입하는 과정 (크로스컷팅과 같은 말)

위빙은 AOP가 핵심 모듈 코드에 전혀 영향을 주지 않으면서 필요한 기능을 추가 할 수 있게 해주는 핵심적인 기능

 

애스팩트(aspect) 또는 어드바이저

애스팩트 - 포인트컷(어디에서) + 어드바이스(무엇을 할 것인지) + (필요에 따라 인트로덕션도 포함)

AspectJ와 같은 자바언어를 확장한 AOP에서는 마치 자바 클래스처럼 애스팩트를 코드로 작성 할 수 있습니다.

 

 

-Primary : 비즈니스 로직 구현

-Cross-Cutting Concern - 부가기능으로서 기존 기능에 추가적인 부분

 

뱅킹 프로그램을 예로 들었을 경우에, 

"계좌 등록", "계좌 이체" , "입출금", "이자" 등의 기능은 "핵심적인 비즈니스 로직"부분인 것이니, Primary 로 분류 할 수 있고, 해당 로직을 실행하며 나오는 로그, 트랜잭션은 Cross Cutting으로 분류 할 수 있습니다.

 

글로만 되어있는 내용들을 정리 해 보았어요. AOP와 관련되어 코드로 정리하고 볼 부분들을 Spring Documnetation을 정리하면서 적으려고 합니다..

 

Spring Documentation이 꽤 어려워서 정리하는데 어려운것 같습니다 ㅠㅠ