본문 바로가기

Wanna be a Programmer/Spring Framework

스프링 프레임워크 - AOP(Aspect Oriented Programming)


AOP(Aspect Oriented Programming)

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


- 공통 모듈(보안 인증, 로깅 같은 요소)를 만든 후에 코드 밖에서 이 모듈을 비지니스 로직에 삽입



AOP의 구성요소

- JoinPoint(조인 포인트) : 공통 관심 사항이 적용 될 수 있는 지점

- 메소드가 호출되는 부분 또는 리턴되는 시점, 필드를 액세스하는 부분, 인스턴스가 만들어지는 지점, 예외가 던져지는 시점, 예외 핸들러가 동작하는 위치, 클래스가 초기화되는 곳 등이 대표적인 조인포인트이다. 각각의 조인포인트들은 그 안의 횡단 관심의 기능이 AOP에 의해 자동으로 추가되어져서 동작할 수 있는 후보지가 되는 것이다.


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

- AOP가 항상 모든 조인포인트를 사용하는 것이 아니기 때문에 필요에 따라 사용해야 할 모듈의 특정 조인포인트를 지정할 필요가 있다. 이와 같은 역할을 하는 것이 포인트컷이다.


- Advice(어드바이스) : 공통관심사항(Cross-cutting) 구현 코드 + 적용시점

- 적용 시점 : 핵심로직 실행 전, 후, 정상종료 후, 비정상 종료 후, 전/후 등

- 주로 메소드 단위로 구성되어 있으며, 포인트 컷에 의해 결정된 모듈의 조인포인트에서 호출되어 사용

- Advice의 종류

* Before : 메소드 실행전에 적용되는 실행

* After-returning : 메소드가 정상적으로 실행된 후에 실행(예외를 던지는 상황은 정상적인 상황에서 제외)

* After-throwing : 예외를 발생시킬 때 적용되는 어드바이스 정의

* Around : 메소드 호출 이전, 이후, 예외 발생 등 모든 시점에서 적용가능한 어드바이스 정의


- Weaving(위빙) : JoinPoint의 Advice에 Aspect를 주입하는 코드를 만드는 것(컴파일 시점, 런타임 시점)

- AOP가 기존의 핵심 관심 모듈의 코드에 전혀 영향을 주지 않으면서 필요한 관심 기능을 추가할 수 있게 해주는 핵심적인 처리 과정이다.


- Aspect(애스팩트) : PointCut(어디에서) + Advice(무엇을 할 것인지)

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



AOP의 구성

<aop:config>

<aop:pointcut/> : pointcut 설정

<aop:aspect> : aspect 설정

<aop:before/> : 메소드 실행 전

<aop:after-returning/> : 메소드 정상 실행 후

<aop:after-throwing/> : 메소드 예외 발생 시

<aop:after/> : 메소드 실행 후(예외 발생 여부 상관 없음)

<aop:around/> : 모든 시점 적용 가능

</aop:aspect>

</aop:config>