AOP(Aspect oriented Programming) - 관점 지향 프로그래밍
    한 어플리케이션 내의 다양한 모듈에서 공통적으로 이용되는 기능을 분리시켜 사용하는 것.
    모듈의 핵심 기능 외의 기능을 해당 모듈에 응집되지 않도록 하기 위한 기술
   
    * 공통적으로 이용되는 기능(공통 관심 사항)이란?
        - 어떤 특정 모듈에서만 필요로 하는 것이 아니라, 어플리케이션 전반에 걸쳐 필요한 기능
            . Logging 기능
            . DB 트랜잭션 기능
            . 보안
            . 기타 등등...
       
   
    * 순수 자바는 공통 관심 사항을 어떻게 적용할까?
        - 상속!
            단점 :  - 다중상속이 불가능한 자바 특성상 다중 모듈에서 사용되는 공통 기능을 상속화 시키기 어렵다
                    - 상속은 코드 구현단에서부터 공통 모듈이 결정되는 정적 방식으로 비추...
                   
        - 공통 class
            단점 :  메소드가 자신의 주요 기능만을 유지하는 것이 아니라, 외부적인 공통 모듈을 호출하는 코드를 갖게 된다.
                    자신에게 필요한 순수 기능만을 유지하는 방법은 없을까?

    이러한 순수 자바의 상속/공통class 의 단점을 보완하기 위해
    Spring AOP는 Aspect(관점) 이라는 특별한 객체로 모듈화하여 가각의 모듈에 공통 기능을 '끼워넣는' 방식을 사용.
   
    * AOP 용어
        - Aspect(관점)
            여러 객체에 공통으로 적용되는 공통 관심 사항
           
        - Advice
            Aspect 가 해야할 작업 내용. 순수 부가기능 자체
           
        - Joinpoint
            어디에 Advice를 적용 할지에 대한 지점으로 메서드 호출, 필드값 변경 등이 여기에 속함.
            code 와 Advice 를 연결해 주는 설정 정보
        - Pointcut
            Joinpoint의 부분 집합. 실제롤 Advice가 적용되는 Joinpoint
            클래스/메소드명/정규표현식 등의 조건을 통해 선택된 Joinpoint 의 일부.
        - Weaving
            Advice. Pointcut 을 조합하여 어플리케이션에 적용하는 과정.
            Weaving 시점 :  컴파일시(class파일생성), 클래스로딩시(JVM), 런타임시
                            스프링은 런타임시점에 Weaving 지원.
        - Target
            Advice 적용될 객체 (모듈)
       
        - Proxy
            Advice 를 Target 에 적용했을 때 생성되는 객체(Target + Advice)
            실제 구현자가 원했던 공통모듈과 모듈의 원래 기능을 모두 수행할 수 있는 객체
       
    * 스프링 AOP 특징
        - 스프링 어드바이스는 자바로 구현한다.
        - 스프링 Aspect 는 Runtime 시점에 만들어진다.
        - 스프링은 메소드 조인포인트만 지원한다.(생성자/소멸자등의 조인포인트 지원불가)
       
    * 스프링에서 AOP 구현시에 사용되는 방법
        - 스프링API를 이용한 AOP 구현                            - 사용성 하
        - POJO 클래스를 이용한 AOP 구현                          - 사용성 중
        - AspectJ5에서 정의한 @Aspect 어노테이션 기반의 구현     - 사용성 상
        => 어떤 구현방식을 사용하던 스프링은 내부적으로 프록시 방식으로 AOP구현된다.  

+ Recent posts