AOP란 무엇인가?

들어가며 

   Spring을 공부하면서 AOP(Aspect-Oriented Programming)은 기본적으로 듣게 되는 단어이고 개념이다.

근데 조금 어렵게 설명되어있지 않나 싶어서 내가 이해하기 편한대로 작성하고자한다.

 

 

AOP란?

 AOP를 한줄로 설명하자면 여러 서비스 레이어나 모듈에 공통적으로 적용되는 로직을 말한다.

자세한 이해를 위해 조금 어렵게(?) 정리하면 아래와 같다.

 

  여러 서비스나 모듈 즉, 핵심(Core)로직에공통적으로 적용되는 로직

관점(Aspect)라는 개념(ex : 로깅처리, 트랜잭션 처리, 보안 처리)으로 분리하고 모듈화하여 필요한 시점에 적용하도록 하는 방법론으로 이는 코드의 재사용성과 가독성을 높인다.

 

 그걸 Java에서는 Spring AOP라는 라이브러리를 통해 쉽게 개발자가 구현할 수 있도록 구성되어있는 것이고

이  AOP를 구현하는데 사용되는 기법들은 상당히 다양하다.

 

 

 

1. 인터셉터 

Spring context level에서 동작하는 인터셉터들은 요청이나 응답, 이벤트 등의 처리 과정의 전, 후에 개입하여 공통적으로 적용되는 로직을 처리할 수 있다.

 

 

2. 프록시 패턴

프록시 서버가 클라이언트 대신 다른 어떤 특정 서버의 접속하는 것처럼,

특정 객체에 대한 접근이나 작업을 수행할 '대리 객체'를 생성하여 이 대리객체의 메소드를 실행하면  핵심로직 메소드의 호출 전후에 공통로직을 처리할 수 있다.

 

아래는 프록시 디자인 패턴을 활용한 예제 코드이다.

 

public interface CoreLogicInterface {
    void CoreLogicMethod();
}


public class CoreLogic implements CoreLogicInterface {
    @Override
    public void CoreLogicMethod() {
        System.out.println("it's core Logic");
    }
}



import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

// 공통로직 : 로깅처리
public class LoggingInvocationHandler implements InvocationHandler {

    private final Object target;

    public LoggingInvocationHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("Before " + method.getName());
        Object result = method.invoke(target, args);
        System.out.println("After " + method.getName());
        return result;
    }
}



import java.lang.reflect.Proxy;

public class Application {

   public static void main(String[] args) {
      CoreLogicInterface coreLogicObject = new CoreLogic();
      CoreLogicInterface proxyObject = (CoreLogicInterface ) Proxy.newProxyInstance(
          coreLogicObject .getClass().getClassLoader(),
          coreLogicObject .getClass().getInterfaces(),
          new LoggingInvocationHandler(coreLogicObject )
      );
      
      proxyObject.CoreLogicMethod();
   }
}

 

 

 

3. Byte Code Injection

  바이트 코드 조작기술은 실행 파일의 바이트 코드를 직접 수정 및 추가하여 추가적인 기능을 삽입하는 방법이다. Java에서는 JMV의 클래스 로더가 클래스를 로드할 떄, 바이트 코드에 추가적인 바이트 코드를 삽입하여 로직을 주입하는 방법으로 이와 관련된 Javassis, ASM 등의 라이브러리가 있다.

 

 이러한 기술도 AOP 형태의 하나로 볼 수 있다.