티스토리 뷰

Java/Spring

SPRING AOP개념

싸드 2015. 7. 28. 15:39
눈아프신분들은 아래 링크 클릭해서 보세요.
정리되있는 주인장 블로그



Spring AOP란?

AOP(Aspect Oriented Programming) 란?

  • 관점 지향적 프로그래밍
  • 자체적인 언어라기보다는 기존의 OOP언어를 보완하는 확장 형태로 사용되고 있다.
  • 자바진영에서 사용되는 AOP도구 중 대표적인것으로는 AspectJ, JBossAOP, SpringAOP 존재

초기 프로그래밍 언어 (기계어, Fortran) -> 절차적 프로그래밍 (C, Pascal) -> 객체지향 프로그래밍 (C++, java, C#) -> 관점지향 프로그래밍 기술이 더해짐(AspectJ) -> 발전한 객체지향 프로그래밍

AOP의 목적 및 잠점

  • 중복을 줄여서 적은 코드 수정으로 전체 변경을 할 수 있게하자 라는 목적에서 출발
  • AOP의 필요성을 이해하는 가장 기초가되는 개념은 관심의분리(Separation Of Concerns)
  • 핵심관점(업무로직) + 횡단관점(트랜잭션/로그/보안/인증 처리 등) 으로 관심의 분리를 실현
  • 중복되는 코드 제거, 효율적인 유지보수, 높은 생상성, 재활용성의 극대화, 변화 수용 용이 등의 장점


AOP 용어

Cross-cutting concerns

Cross-cutting concerns에 대하여 이야하기하기 전에 Concern이 무엇인지 먼저 이해해야 한다. Concern을 우리말로 번연핵 보면 “관계,관심,걱정,염려”로 풀이할 수 있다. 관심이 가는것, 걱정해야할 것. 우리들이 애플리케이션이 개발하기 위하여 관심을 가지고 구현해야하는 각각의 기능들을 하나의 Concern이다. Concern에는 해당 애플리케이션에서 필요로하는 비지니스 로직도 될 수 있으며, Logging, Tranaction처리, Security등 각각 하나의 Concern이다
그렇다면 Cross-cutting concerns이란? Cross가 나오는거 보니까 여러 기능들에 관여하는 Concern인가보다. Cross-cutting concerns이란 하나의 영역에서만의 고유한 Concern이 아니라 여러군데서 공통적으로 관여하는 Concern. 예를들어 Logging, Transaction처리 Security등은 어떨가? 이런것들이 Cross-cutting concerns이 될수 있겠다.

  • Advice : Logging과 같은 Cross-cutting concerns의 경우 거의 모든 클래스에 분산되어 있는 것을 볼 수 있다. 이와 같은 Cross-cutting concerns을 여러영역에 분산해 구현하는 것이 아니라한곳에 모아서 구현하는것을 Advice라고한다. 즉, 일정한 패턴을 가지는 클래스의 특징 Method는 해당 Logging을 출력하라는 구현부분을 가지는 것을 Advicce라고 한다.
  • JoinPoint : 메소드 호출이나 특정 예외를 던지는 것과 프로그램이 실행되는 지점을 이야기한다.
  • Point-Cut : Cross-cutting concerns에 해당하는 기능을 구현한 부분이 Advice라고 했다. 그렇다면 이렇게 구현되어 있는 Advice는 어떤패턴을 가지는 클래스와 메서드에 적용할지 결정하는 것이 Point-Cut이다. 즉 해당 Advice가 적용되어야 하는 곳을 가리키는 것이 Point-Cut이다 즉 JoinPoint의 모음이 Point-Cut이다.
  • Aspect : Aspect는 Advice와 Point-Cut을 합쳐서 하나의 Aspect라고 한다. Advice와 Point=Cut을 이용하여 Logging이라는 Concern을 분리하여 독립적으로구현할 수 있었다. 이처럼 Advice와 Point-Cut을 이용하여 원하는 Concern을 구현하는것을 하나의 Aspect라고한다.
  • Introduction : 실행되고 있는 클래스에 새로운 인터페이스를 추가하여 원래의 Object가 가지고 있는 속성, 행위이외의 다른일이 가능하도록 하게된다.
  • weaving(위빙) : 어드바이스를 핵심코드 로직에 적용하는것을 위빙이라고한다.

Advice 선언방식

  • 이전(Before) : 어드바이스 대상 메소드가 호출되기 전에 어드바이스 기능을 수행한다.
  • 이후(After) : 결과에 상관없이 어드바이스 대상 메소드가 완료된 후에 어드바이스 기능을 수행한다.
  • 반환이후(after-returing) : 어드바이스 대상 메소드가 성공적으로 완료된 후에 어드바이스 기능을 수행
  • 예외발생이후(after-throwing) : 어드바이스 대상 메소드가 예외를 던진 후에 어드바이스 기능을 수행
  • 주위(around) : 어드바이스가 어드바이스 대상메소드를 감싸서 어드바이스 대상 메소드 호출 전과 후에 실행된다.

Weaving 적용방식

Weaving 적용방식은 3가지 방식이존재함

1.컴파일시에 위빙하기

  • 컴파일 시 코드를 삽입하는 방법은 aspect에서 사용하는 방식이다.
    컴파일방식에서는 핵심 로직을 구현한 자바 콛를 컴파일 할 때 알맞은 위치에 공통코드를 삽입한다. 공통코드는 횡단관심사를 모듈화한 코드를 말함
    이렇게 컴파일된 코드는 AOP가 적용된 클래스 파일이 생성된다.
    컴파일 방식을 제공하는 AOP도구는 공통코드를 알맞게 위치에 삽입할 수 있도록 도와주는 컴파일러나 IDE를 제공한다.

2.컴파일 로딩시에 위빙하기

  • AOP 라이브러리는 JVM이 클래스를 로딩할 때 클래스 정보를 변경할 수 있는 에이전트를 제공한다. 이 에이전트는 로딩한 클래스의 바이너리 정보를 변경하여 알맞은 위치에 공통 코드를 삽입한 새로운 클래스 바이너리 코드를 기록한다.

3.런타임 시에 위빙하기 ( 제일중요: 스프링은 자체적으로 프록시 기반의 AOP를 지원하고 있음)

  • 런타임시 AOP를 적용할 때는 소스코드나 클래스 정보 자체를 변경하지 않는다. 대신 프록시를 이용하여 AOP를 제공한다.
    AOP는 핵심로직을 구현한 객체에 직접 접근하는 것이 아니라 중간에 프록시를 생성하여 프록시를 통해 핵심로직을 구현하게된돠.
    이때, 프록시는 핵심로직을 실행하기 전 또는 후에 공통기능을 적용하는 방식으로 AOP를 적용한다.
    프록시기반에서는 메서드가 호출될때에만 어드바이스를 적용할 수 있기 때문에 필드값 변경과 같은 조인 포인트에 대해 적용할 수 없는 한계가 있다.

Spring AOP의 특징

  1. 스프링은 자체적으로 프록시 기반의 AOP를 지원한다.
    그래서 스프링 AOP는 메서도 호출 조인포인트만 지원한다. 만약 필드 값 변경 같은 조인포인트를 사용하고 싶다면 Aspectj같은 풍부한 기능을 지원하는 AOP도구를 사용해야한다.
  2. 스프링 AOP는 자바 기반이다.
    AspectJ는 에스팩트를 위한 별도의 문법을 제공하고 있는 반면 스프링은 별도의 문법을 익힐 필요 없이 자바언어를 이용하면 가능하다.

스프링 AOP 구현 3가지 방식

  1. xml 스키마 기반의 POJO 클래스를 이용한 AOP 구현

<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/scheme/aop/spring-aop.xsd"> 

    <!-- aop Logging -->
    <aop:confing>
        <aop:aspect ref="Log">
               <aop:pointcut id="servicePointCut" expression="execution(*.*)" />
            <aop:before pointcut-ref="servicePointCut" method="beforeServiceInfoLog" />
            <aop:afrer pointcut-ref="servicePointCut" method="afterServiceInfoLog"/>
        </aop:aspect>
    </aop:confing>

    <bean id="Log" class="pe.kr.imjehoon.xxx" />
</beans>

위와 같이 로그를 지정하여 서 할 수도 있다..음 근데 나는… Log4j 써서하는데 흐음~ 뭐가 더 유용한지는 사용자의 판단에 따라 다르겠지~

  1. AspectJ 5.6에서 정의한 @Aspect 어노테이션 기반의 AOP구현
    @Aspect어노테이션은 AspectJ 5버전에서 추가된 어노테이션으로 사용시 xml 파일에 Advice 및 PointCut등을 설정하지 않고도 자동으로 advice할 수 있다.
    spinrg 2버전부터 지원
  2. 스프링 API를 이용한 AOP구현


'Java > Spring' 카테고리의 다른 글

Spring IOC/DI 개념  (0) 2015.07.28
Spring 한글 깨짐 설정  (0) 2015.07.28
Spring WebSocket sockJS 채팅 예제  (0) 2015.07.23
Spring locale 나라 별 코드  (0) 2014.04.14
Cookie 생성/ 설정/ 삭제  (0) 2012.08.19
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함