AOP (순수 Java)

Codren·2021년 6월 20일
0

AOP

목록 보기
1/3

Section 1. AOP

1. AOP (Aspect Oriented Programming)

핵심 기능이 아닌 부가 기능적인 관점에서 보았을 때 여러 곳에서 쓰이는 공통된 요소(Aspect)들을 추출(Cross-Cutting)하여 모듈화하는 기법으로 유지보수 및 재사용에 용이한 방법론

  • OOP : 비지니스 로직의 모듈화 (하나의 기능을 수행하는 객체를 위한 방법론)

  • AOP : 인프라 혹은 부가기능의 모듈화 (여러 객체를 위한 공통 기능을 제공하는 방법론)
    - 대표적인 예 : 로깅, 트랜잭션, 보안 등
    - 각각의 모듈들의 주 목적 외에 필요한 부가적인 기능들




2. AOP 용어

  • 타겟 (Target)
    - 부가기능을 부여할 대상을 의미

  • 애스펙트 (Aspect)
    - 타겟에 부가되는 공통적인 기능

  • 프록시 (Proxy)
    - 타겟을 감싸서 타겟의 요청을 대신 받아주는 랩핑(Wrapping) 오브젝트이며 타겟을 호출하게 되면 타겟이 아닌 프록시가 호출되어, 타겟 메소드 실행전에 전처리, 타겟 메소드 실행, 후처리를 실행




3. AOP 사용 전

  • result 를 계산하는 핵심 기능 로직외에 처리되는 시간을 구하는 부가기능
long start = System.currentTimeMillis();		// 부가기능
		
int result = this.kor + this.eng + this.math;	// 핵심기능
	
Thread.sleep(200);				// 부가기능
long end = System.currentTimeMillis();		// 부가기능
System.out.println(end - start);		// 부가기능

return result;




4. Proxy 클래스

  • Java 에서 제공하는 Proxy 클래스 존재

  • Proxy 를 이용한 AOP 동작 과정

    ① 메인 프로그램에서 실제 객체가 아닌 Proxy 호출
    ② Proxy 에서 부가 기능 수행
    ③ Proxy 에서 실제 객체의 메서드 호출 (invoke() 메서드 내에서 method.invoke () 메서드 수행)
    ④ 실제 객체의 메서드가 수행 완료되면 제어권이 다시 Proxy 에게 넘겨지고 나머지 부가 기능 수행




Section 2. 순수 Java AOP

1. Proxy 구현

  • 프록시 클래스 객체 생성 (익명 클래스)


  • 프록시 클래스 객체 생성 (클래스 정의)




2. Proxy.newProxyInstance

  • Proxy 클래스 내부에 존재하는 newProxyInstance 메서드 (프록시 객체 생성)
  • 3개의 매개변수 존재

        ① ClassLoader loader - 프록시 객체가 대신하게 될 실제 객체를 클래스 로더를 통해 지정
        ② Class<?>[] interfaces - 프록시 객체가 대신하게 될 실제 객체가 구현하고 있는 인터페이스(들)
        ③ InvocationHandler h - 실제 객체를 대신해서 수행하게 될 부가기능 + 실제 객체 호출 부분

  • 클래스 로더 - 컴파일 후 .class 클래스 파일을 동적으로 JVM위에 로딩
  • .class 는 메타데이터, getclassLoder 를 통한 클래스 로더는 클래스 정의 그자체
  • 프록시 객체는 임의의 객체를 대신하도록 설계 되므로 클래스 로더를 전달해야함




3. invoke 메서드

  • InvocationHandler 인터페이스를 구현한 객체는 invoke 메소드를 오버라이딩 해야함
  • invoke 메서드 3개의 매개변수 존재

        ① Object proxy - Proxy 객체 자기 자신
        ② Method method - 실제로 호출될 메서드의 메타데이터
        ③ Object[] args - 실제로 호출될 메서드에 넘겨질 인자(들)

  • proxy 는 거의 쓰이지 않지만 메서드 체이닝 등에 사용됨 스택오버플로우 참고
  • Method 클래스는 메서드의 정보를 담고 있음 -> method.getName() 등 수행 가능
  • method.invoke(tartget, args) -> 실제 target 객체의 method 를 호출

0개의 댓글