[TIL] AOP ( Aspect Oriented Programming)

bae_mung·2021년 10월 21일
0

Study

목록 보기
9/12
post-thumbnail

관심사의 분리!

OOP를 더 OOP스럽게 만들어 주는 기술

장점

  1. 공통 로직과의 의존성 x
  2. 단위테스트 용이
  3. 핵심 로직에 집중 -> 코드관리, 가독성 용이

AOP 도입 전

XXXService{
	login() {
		1. 로그를 남김
        	2. login 처리 로직
	}
    
    	register() {
    		1. 로그를 남김
        	2. register 처리 로직
   	}
	
        XXX() {
            login, register 로그를 복붙 (코드 중복 -> 유지보수 어려움)
        }
   
}

리팩토링1

XXXService{
	login() {
		1. log();
        	2. login 처리 로직
	}
    
    	register() {
    		1. log();
        	2. register 처리 로직
   	}
	
        log(){
            로그를 남김
        }
        
}

YYYService{
        write(){
            XXXService.log(); // 의존성 생김(결합도 ↑)
        }
        
}

리팩토링2

XXXService{
	login() {
		1. LogService.log();
        	2. login 처리 로직
	}
    
    	register() {
    		1. LogService.log();
        	2. register 처리 로직
   	}
}

YYYService{
        write(){
            LogService.log();
        }
        
}

LogService{
        log(){
            로그를 남김
        }
}

log() 메소드 호출 코드까지 관심사로 봄 => 호출코드까지 분리해야 완벽한 관심사의 분리

AOP (Aspect Oriented Programming) 용어

  • 핵심 로직 (Core Concern) : 우리가 직접 구현하는 주요 로직들, 공통 로직을 활용(사용) 대상

  • 횡단(공통) 로직 (Cross-Cutting Concern) : 여러 핵심 로직에서 재사용되는 공통(공용) 로직

  • Advice : 공통 로직 Class

  • Target : 핵심 로직 Class, Advice가 적용될 대상

  • Weaving : AdviceTarget에 적용, 처리해주는 작업
    Weaving 의 작업 방식 3가지

    1. Compile-Time Weaving
      XXX.class(공통 로직 호출코드 X) - Weaving -> XXX.class(공통 로직 호출코드 O)
    2. Run-Time Weaving
      XXX.class - 메모리 로드 (바이트코드 조작) -> XXX.class(메소드안에 공통 로직 호출코드 포함)
    3. Proxy Weaving (Spring 방식)
      XXX.class - 실행 시 Proxy 생성 -> XXX_Proxy.class(공통 로직 호출코드 O)
  • JoinPoint : 어떤 부분, 어디에 Advice 적용, 코드 삽입할지 위치

  • PointCut : target 필터링 + method 필터링 역할
    표현식 사용(주로 AspectJ 표현식 사용)
    => 메소드 호출 관련 => execution(메소드 선언부 : public * *(..) throws XXXException) (..은 0개 이상)

    Spring은 Proxy기반 위빙 사용.
    PointCut에 관련된 JoinPoint메소드 호출 관련된 것만 가능!

profile
SSAFY 6th 👨‍💻🔥

0개의 댓글