5 spring을 이용한 aspect 지향 프로그래밍

Aspect-Oriented Programming (AOP)은 프로그램 구조에 대한 또 다른 사고 방식을 제공함으로써 객체 지향 프로그래밍 (OOP)을 보완합니다. OOP의 모듈성의 핵심 단위는 클래스이지만 AOP에서는 모듈화 단위가 측면입니다. 여러 측면은 여러 유형 및 객체를 가로 지르는 관심 사항 (예 : 트랜잭션 관리)의 모듈화를 가능하게합니다. (이러한 우려는 종종 AOP 문헌에서 "크로스 커팅 (crosscutting)"문제로 불린다.)

Spring의 핵심 컴포넌트 중 하나는 AOP 프레임 워크이다. Spring IoC 컨테이너는 AOP에 의존하지 않지만 (원하지 않으면 AOP를 사용할 필요가 없다), AOP는 Spring IoC를 보완하여 매우 뛰어난 미들웨어 솔루션을 제공한다.

Spring 2.0+ AOP

Spring 2.0은 스키마 기반 접근법 이나 @AspectJ 주석 스타일 을 사용하여 사용자 정의 측면을 작성하는보다 간단하고 강력한 방법을 소개했다 . 이 두 스타일은 스프링 AOP를 사용하면서 AspectJ pointcut 언어를 완벽하게 유형화 된 조언과 사용법을 제공합니다.

이 장에서는 Spring 2.0+ 스키마와 @ AspectJ 기반 AOP 지원에 대해 설명한다. Spring 1.2 애플리케이션에서 흔히 볼 수있는 낮은 레벨의 AOP 지원 은 다음 장 에서 논의된다 .

AOP는 Spring Framework에서 다음과 같은 용도로 사용됩니다.

  • 선언적 엔터프라이즈 서비스를 제공합니다. 특히 EJB 선언적 서비스를 대체합니다. 가장 중요한 이러한 서비스는 선언적 트랜잭션 관리 입니다.

  • 사용자가 AOP와 함께 OOP 사용을 보완하면서 사용자 정의 측면을 구현할 수있게하십시오.

일반적인 선언적 서비스 나 풀링과 같은 사전 패키지 된 선언적 미들웨어 서비스에만 관심이 있다면 Spring AOP와 직접 작업 할 필요가 없으며이 장의 대부분을 건너 뛸 수있다.

AOP (Aspect Oriented Programming)

기존의 비즈니스로직 외 작성해야 하는 코드를 별도로 분리함으로써 개발자가 좀 더 비즈니스 로직에만 집중해서 처리할 수 있는 방법을 제공

=> 비즈니스로직이 아닌 공통적이고 반족적인 코드를 처리하기 위한 방법

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

공통 모듈(보안 인증, 로깅 깥은 요소 등)을 만든 후에 코드 밖에서 이 모듈을 비지니스 로직에 삽입하는 서이 바로 AOP적인 개발이다. 코드 밖에서 설정된다는 것이 핵심이다.

AOP가 사용되는 경우

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

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

2) 트랜잭션 처리

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

3) 예외 반환

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

4) 아키텍처 검증

5) 기타

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

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

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

  • 로깅, 인증, 권한 등

Last updated