봉봉의 개인 블로그

2017-07-25-E(Spring AOP) 본문

학원에서 배운것들/TEA - E

2017-07-25-E(Spring AOP)

봉봉이네 2017. 7. 25. 09:15

(1).정의

AOP는 Aspect-Oriented Programming 의 약자로 관점 지향 프로그래밍이라고 한다.

AOSD (Aspect-Oriented Software Development)의 한 측면을 표현한다.


(2).AOP 등장배경

절차지향 프로그래밍 ->

객체지향 프로그래밍(OOP) : 유지보수성과 확장성 &

관점지향 프로그래밍(AOP) : 객체지향적인 프로그래밍을 지향하면서 유지보수가 좀 더 편리하게 하기 위한 방법


-OOP의 한계

OOP의 대표적인 상속은 컴파일시 행동이 결정 되므로 실행시에 특징을 바꿀수 없습니다. 그리고 모든 서브 클래스에서 동일한 코드 상속받게 될 경우 슈퍼클래스의 변경이 이루어 졌을 때 일부 서브 클래스에서 원치않는 변경을 받아들여야만 합니다. 상속은 전혀 유연하지 못합니다. 이를 해결하기 위해 구성이라는 기법을 사용하죠. 구성은 상속의 모든 단점을 해결해 줍니다. 실행중 동적으로 행동을 바꿀 수 있으며 슈퍼 클래스가 없으므로 의존도가 제거 됩니다. 하지만 이런 구성도 단점이 있기 마련입니다. 슈퍼 클래스의 코드를 재사용할 수 없고 구성 객체에게 위임해야하는 번거로움이 있습니다.

-AOP의 등장

OOP의 한계를 보완하고자 AOP가 등장했습니다 .상속과 구현만으로 곤란했던 흩어진 중복코드를 제거 할 수 있습니다.AOP의 기본 개념은 횡단 관심사에 대한 모듈화입니다.
(횡단 관심사란 보안,로깅,트랜젝션등과 같은 기능들처럼 한 애플리케이션의 여러부분에 걸쳐 있는 기능을 의미한다. 즉,횡단관심사는 한마디로 한 애플리케이션의 여러부분에 영향을 주는 기능이라고도 할 수 있다.)

횡단 관심사를 모듈화할 때 특별한 클래스로 모듈화 하는데 그 특별한 클래스가 바로 애스팩트라고 부른다.


(3).AOP가 사용되는 경우

1.간단한메소드 성능 검사

개발 도중 특히 DB에 다량의 데이터를 넣고 빼는 등의 채피 작업에 대하여 시간을 측정해보고 쿼리를 개선하는 작업은 매우 의미가 있다. 이 경우 매번 해당 메소드 처음과 끝에 System.currentTimeMillis();를 사용하거나, Spring이 제공하는 stopwatch 코드를 사용하기는 매우 번거롭다. 이런 경우 해당 작업을 하는 코드를 밖에서 성정하고 해당 부분을 사용하는 편이 편리하다.

****

System.currentTimeMillis(); 와 stopwatch 는 특정로직에 대해서 성능 확인(속도체크)를 하기 위해서 사용되기도함.


2.트랜잭션 처리

트랜잭션의 경우 비지니스 로직의 전후에 설정된다. 하지만 매번 사용하는 트랜잭션(try~catch부분)의 코드는 번거롭고,소스를 더욱 복잡하게 보여준다.


3.예외 반환

Spring 에는 DataAccessException이라는 매우 잘 정의되어 있는 예외 계층 구조가 있다. 예전 하이버네이트 예외들은 몇개 없었고 그나마도 Uncatched Exception이 아니였다. 이렇게 구조가 별로 안좋은 예외들이 발생했을때, 그걸잡아서 잘 정의되어 있는 예외 계층 구조로 변환해서 다시 던지는 애스팩트는 제3의 프레임워크를 사용할 때 , 본인의 프레임 워크나 애플리케이션에서 별도의 예외 계층 구조로 변환하고 싶을 때 유용하다.


4.아키텍처 검증


5.기타

-하이버네티스와 JDBC를 같이 사용할 경우, DB동기화 문제 해결

-멀티쓰레드 Safety관련하여 작업해야 하는 경우, 메소드들에 일괄적으로 락을 설정하는 애스팩트

-데드락 등으로 인한 PessimisticLockingFailureException등의 예외를 만났을 때 재시도하는 애스팩트

-로깅,인증,권한 등


(4).AOP의 구성요소

1.조인포인트(joinPoint) - 횡단 관심 모듈의 기능이 삽입되어 동작할 수 있는 실행 가능한 특정위치

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

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

AOP가 항상 모든 모듈의 모든 조인포인트를 사용할 것이 아니기 때문에 필요에 따라 사용해야 할 모듈의 특정 조인포인트를 지정할 필요가 있다. 일종의 조인포인트 선정 룰과 같은 개념이다. AOP에서는 포인트컷을 수행할 수있는 다양한 접근 방법을 제공한다. AspectJ에서는 와일드카드를 이용한 메소드 시그니처를 사용한다.

3.어드바이스(advice)또는 인터셉터(intercepter) - 어드바이스 - 각 조인포인트에삽입되어져 동작할 수 있는 코드

주로 메소드 단위로 구성된 어드바이스는 포인트컷에 의해 결정된 모듈의 조인포인트에서 호출되어 사용된다. 일반적으로 독립적인 클래스 등으로 구현된 횡단 관심 모듈을 조인포인트의 정보를 참조해서 이용하는 방식으로 작성된다.

인터셉터 - 인터셉터 체인 방식의 AOP툴에서 사용하는 용어로 주로 한개의 invoke 메소드를 가지는 어드바이스

4.어드바이스(advice)의 종류

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

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

After throwing advice : 예외를 발생시킬 때 적용되는 Advice를 정의(catch와 비슷)

Around advice  : 메서드 호출 이전, 이후,예외 발생 등 모든 시점에서 적용 가능한 Advice를 정의

5.위빙(weaving) 또는 크로스 컷팅(crossCutting)

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

위빙은 AOP가 기존의 핵심 광심 모듈의 코드에 전혀 영향을 주지 않으면서 필요한 횡단 관심 기능을 추가할 수 있게 해주는 핵심적인 처리과정이다. 위빙을 처리하는 방법은 후처리기를 통한 코드 생성 기술을 통한 방법부터 특별한 컴파일러 사용하는 것, 이미 생성된 클래스의 정적인 바이트 코드의 변환 또는 실행 중 클래스 로더를 통한 실시간 바이트 코드 변환 그리고 다이나믹 프록시를 통한 방법까지 매우 다양하다.

6.인트로 덕션(introduction) 또는 인터 타입 선언

인트로덕션 - 정적인 방식의 AOP기술

동적인 AOP방식을 사용하면 코드의 조인포인트에 어드바이스를 적용해서 핵심관심 코드의 동장 방식을 변경할 수 있다.

인트로덕션은 이에 반해서 기존의 클래스와 인터페이스에 필요한 메소드나 필드를 추가해서 사용할 수 있게 해주는 방법 OOP에서 말하는 오브젝트의 상속이나 확장과는 다른 방식으로 어드바이스 또는 애스팩트를 이용해서 기존 클래스에 없는 인터페이스 등을 다이나믹하게 구현해 줄 수 있다.

7.애프팩트(aspect)또는 어드바이저

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

AspectJ와 같은 자바 언어를 확장한 AOP에서는 마치 자바의 클래스 처럼 애스팩트를 코드로 작성할 수 있다. AOP툴의 종류에 따라서 어드바이스와 포인트 컷을 각각 일반 자바 클래스로 작성하고 이를 결합한 어드바이저 클래스를 만들어서 사용하는 방법도 있다.

Primary(core) Concern - 비지니스 로직을 구현한 부분

Cross-Cuttiong Concern - 보안,인증,로그 등과 같은 부가적인 기능으로써 시스템 전반에 산재되어 사용되는 기능

Code - Primary(core) concern을 구현해 놓은 코드의 이야기


(5).AOP의 보통 설정 구조

1
2
3
4
5
6
7
8
9
10
<aop:config
    <aop:pointcut /> : pointcut 설정
    <aop:aspect> : aspect를 설정
        <aop:before /> : method 실행 전
        <aop:after-returning /> : method 정상 실행 후
        <aop:after-throwing /> : method 예외 발생 시
        <aop:after /> : method 실행 후 (예외 발생 예부 상관 없음)
        <aop:around /> : 모든 시점 적용 가능
    </aop:aspect>
</aop:config>
cs


Comments