Skip to content

spring AOP #
Find similar titles

Structured data

Category
Programming

AOP란? #

관점 지향 프로그래밍(aspect-oriented programming)은 관심사를 분리하여 개발의 복잡성을 낮추기 위한 프로그래밍 패러다임의 하나이다. 물론 관심사의 분리라는 개념이 모듈화/캡슐화를 기반으로 하는 OOP(객체 지향 프로그래밍)에도 존재하지만 객체지향의 기본원칙을 지키면서 횡단관심사를 모듈화하는 것은 매우 어렵고, 아이러니하게도 코드의 복잡성을 증대시키는 단점이 있다. AOP는 이러한 횡단관심을 분리시켜 핵심 비지니스 로직에 공통모듈을 삽입하여 OOP의 개념을 더욱 객체 지향적으로 만들어준다.

image

그림1 횡단관심사 분리

출처: http://dev.anyframejava.org/anyframe/doc/core/3.2.1/corefw/index.html

주요 용어 #

image

그림2 AOP 용어

출처: https://linkednest.net/share/jwleeDev/view/454

  • 핵심관심사항
    • 핵심 비지니스 로직을 다루는 관심 사항이다.
  • 공통관심사항
    • 보안, 트랜잭션 등등 여러 객체에 공통으로 적용되는 관심사항이다.
    • 횡단 관심사를 의미한다.
  • Target
    • 핵심사항이 구현된 객체를 말한다. 핵심 비지니스 로직를 가진 객체이다.
  • JoinPoint
    • 공통관심사항이 적용될 수 있는 지점을 말한다.
    • 즉 Advice를 적용 가능한 지점을 의미한다.
    • 매서드 호출, 예외발생, 필드값 수정 또는 객체 생성이 JoinPoint가 될 수 있다.
  • Advice
    • 공통관심사항의 구현 코드로 적용 시점을 정의 한다.
    • 핵심 비지니스 로직을 중심으로 언제 공통관심사항이 실행될 지를 정의한다.
    • around, Before, After, after-returning, after-throwing 와 같은 선언방식으로 사용한다.
  • Aspect
    • JoinPoint와 Advice를 아우르는 표현이다.
    • 트랜잭션이나 보안등이 Aspect의 좋은 예이다.
  • Weaving
    • JoinPoint에 Advice를 삽입하는 과정으로 핵심 비지니스 로직에 전혀 영향을 주지 않은 상태에서 공통관심기능을 추가하는 AOP의 핵심적인 처리과정이다.
    • 컴파일시, 클래스로딩시, 런타임시에 위빙할 수 있다.

Spring AOP 특징 #

Java 기반 #

advice를 java 파일로 구현학기 때문에 추가적인 문법을 배울 필요가 없다. 필드 값 변경과 같은 조인포인트를 사용하기 위해서는 AspectJ 사용할 때는 예외이지만 spring 2.0 이후에는 AspectJ의 모든 포인트 컷 표현 방법을 지원하고 있다.

프록시 기반 AOP 지원 #

단, 메서드 호출 조인포인트만을 지원한다. 하지만 AspectJ를 통해 여러 포인터 컷 표현 방법을 사용할 수 있다.

AOP alliance 인터페이스 구현 #

AOP 인터페이스를 구현하여 AOP 구현체 간 advice를 사용있다.

구현 #

라이브러리 추가 #

구현하고자하는 AOP 방식에 따라 aspectj등 라이브러리를 추가 할 수 있다.

    <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-aspects</artifactId>
       <version>3.2.9.RELEASE</version>
    </dependency>
    <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-aop</artifactId>
       <version>4.1.5.RELEASE</version>
    </dependency>

설정 #

방법 1 : XML 스키마 기반 AOP구현 #

    // AOP 설정정보
    <aop:config>
        // aspect 설정, ref에는 공통기능을 구현하는 빈을 연결
        <aop:aspect ref="log"> 
            //pointcut 설정, id는 식별자, expresstion은 aspectJ표현식을 입력 
            <aop:pointcut id="" expression="" /> 
            <aop:before /> // 실행 전
            <aop:after-returning /> // 정상 실행 후
            <aop:after-throwing /> // 예외 발생 시
            <aop:after /> // 실행 후
            <aop:around /> // 모든 시점
        </aop:aspect>
      </aop:config>

방법 2 : @Aspect 어노테이션 기반 AOP구현 #

Spring 2.0 이후 버전 부터 어노테이션을 통하여 XML파일에 Advice / pointCut 등을 설정하지 않아도 간편하게 advice를 할 수 있다.

방법 3 : Spring API AOP구현 #

프록시 서버를 이용한 AOP구현 방식으로 메서드 호출시에만 AOP를 적용할 수 있다.

image

그림3 Spring AOP 구현 방식

출처: https://stackoverflow.com/questions/29650355/why-in-spring-aop-the-object-are-wrapped-into-a-jdk-proxy-that-implements-interf

관련 키워드 #

스프링, SPRING, AOP, OOP, Aspect, mvc, DI, 관점지향, aop pointcut, aop xml, aop 설정, 횡단관심사, 공통관심사, 프록시

0.0.1_20140628_0