본문 바로가기
카테고리 없음

Spring(5) - AOP

by SeleniumBindingProtein 2022. 1. 29.
728x90
반응형

1. 관점 지향 프로그래밍의 등장
    1) 주기능인 회원 등급 구현시 로깅 기능, 보안 기능, 트랜잭션 기능 등의 보조기능을 
       일일이 구현해야함.
    2) 규모가 있는 웹 애플리케이션일 경우 이런 작업을 수작업으로 하기에는 소스코드 복잡해짐
       유지관리에 문제가 생길수 있음
       ==> AOP (Aspect Oriented Programming)을 이용해서 주기능과 보조기능을 분리해서
           메서드에 적용함.   


2. 핵심기능과 부가기능 
    1) 업무(Biz)로직을 포함하는 기능을 핵심 기능 (Core Concerns)           
    2) 핵심기능을 도와주는 부가적인 기능(로깅,보안 등)을 부가기능 (Cross-cutting Concerns)
    3) 객체지향의 기본 원칙을 적용하여도 핵심기능에 부가기능을 분리해서 모듈화하기는 어려움.

3. AOP 개요


    1) 애플리케이션에서의 관심사의 분리(기능의 분리), 
       핵심기능에서 부가기능을 분리함.
    2) 분리한 부가기능을 애스펙트(Aspect)라는 모듈형태로 개발하는 방법.      

4. AOP 용어    

    1) 애스펙트 (Aspect)     
          - 부가기능을 정의한 코드인 어드바이스(Advice) + 어드바이스를 어디에 적용할지를 결정하는 포인트컷(PointCut)을 합친 것.
            Advice + PointCut = Aspect (= Advisor 어드바이저)
          - AOP의 기본 모듈임.
          - 싱글톤 형태의 객체로 존재함.  
          - 어드바이스(Advice) : 핵심기능에 제공할 부가기능을 담고 있는 모듈.
          - 조인 포인트(Join Point) : 어드바이스가 적용될 수 있는 위치.
          - 포인트 컷(PointCut) : 어드바이스를 적용할 타겟의 메서드를 선별하는 정규표현식. execution으로 시작함.

        - 핵심기능 코드 사이에 부가된 부가기능을 독립적인 애프펙트로 구분할수 있음.  
    2) 타겟(Target)
        - 핵심기능을 담고 있는 모듈.
        - 타겟은 부가기능을 부여할 대상이 됨.

    3) 위빙(Weaving)
        - 포인트컷에 의해서 결정된 타겟의 조인 포인트에 부가기능(어드바이스)을 삽입하는 과정.
        - 위빙은 AOP가 핵심기능(타겟)의 코드에 영향을 주지 않으면서 필요한 부가기능(어드바이스)을 추가할수 있도록 해주는 처리과정. 
        - Advice를 주기능에 적용하는 것  

5. Spring AOP의 특징
    1) Spring은 타겟(Target) 객체에 대한 프록시를 만들어 제공함.
    2) 타겟을 감싸는 프록시는 실행시간(Runtime)에 생성됨.
    3) 프록시 : 어드바이스를 타겟객체에 적용하면서 생성되는 객체.
    4) 프록시가 호츨을 가로챔(Intercept)
        - 프록시는 타겟 객체에 대한 호출을 가로챈 다음 어드바이스의 부가기능 로직을 수행하고 난 후  타겟의 핵심기능 로직을 호출함

          (전처리 어드바이스)


        - 타겟의 핵심기능 로직 메서드를 호출한 후에 부가기능(어드바이스)을 수행하는 경우(후처리 어드바이스)
   


6. 스프링 프레임워크에서 AOP 기능 구현 
    1) API를 이용하는 방법
    2) @Aspect 애너테이션 이용하는 방법

7. execution 지시자
    1) 가장 정교한 포인트것을 만들 수 있음
      - 리턴타입, 패키지, 클래스명, 메서드명, 메서드 매개변수에 포인트 컷 지정 
    2) 여러가지 포인트 컷 표현식 
      Pointcut                                         JoinPoints
    ------------------------------------------------------------------------
     execution(public *.*(..))                public 메서드 실행 
     execution(* set*(..))                    이름이 set으로 시작하는 모든 메서드명 실행
     execution(* get*(..))                    이름이 get으로 시작하는 모든 메서드명 실행
     execution(* kr.co.ezen07.member.controller.MemberController.*(..))
                                                            MemberController 인터페이스의 모든 메서드 실행
     execution(* kr.co.ezen07.member.controller.*.*(..))
                                                            controller 패키지의 모든 메서드 실행
     execution(* kr.co.ezen07.member.controller..*.*(..))                                         
                                                             controller 패키지와 하위 패키지의 모든 메서드 실행  

8. 어드바이스 동작 시점 
    1) Before 어드바이스
      - 메서드 실행 전에 동작 
      - JoinPoint 앞에서 실행되는 Advice 
    2) After 어드바이스
      - 메서드 실행 후에 동작 
      - JoinPoint 뒤에서 실행되는 Advice 
    3) Around 어드바이스 
      - 메서드 호출 이전, 호출 이후 시점에서 동작 
      - JoinPoint 앞과 뒤에서 실행되는 Advice 
    4) After-returning  어드바이스
      - 메서드가 정상적으로 실행된 후에 동작
    5) After-throwing 어드바이스
      - 예외가 발생한 후에 동작   

9. Spring AOP 구현 방식
  1) @Aspect 어노테이션을 이용한 AOP 구현 
    -  @Aspect 어노테이션을 이용해서 부가기능을 제공하는 Aspect 클래스를 작성  
    - XML 설정 파일에 <aop:aspectj-autoproxy>          

728x90
반응형

댓글