AOP란? 관점 지향 프로그래밍 정리 (feat. Proxy)

이기성·2024년 7월 25일

CS 지식

목록 보기
2/2
💡 AOP - 애플리케이션의 핵심 비즈니스 로직과 부가적인 기능(공통 관심 사항)을 분리하여 개발하는 방법

  • 공통 관심사인 Aspect 들을 모아서 모듈화 한다.
  • 비즈니스 로직에서 분리하여 모듈화된 Aspect를 붙여서 사용한다.

AOP 주요 개념

  • Aspect : 흩어진 관심사를 모듈화 한 것.
  • Target : Aspect를 적용하는 곳 (클래스, 메서드 .. )
  • Advice : 부가 기능을 담은 구현체.
  • JoinPoint : Advice가 적용되는 시점
  • PointCut : Advice를 적용할 메소드의 범위

어떻게 구현하는가? (Proxy)

JDK Dynamic Proxy VS CGLib

  • JDK Dynamic Proxy
    • 인터페이스를 기반으로 Proxy 객체를 생성해준다.
    • Java.lang.reflect.Proxy 의 static 메서드인 newProxyInstance()를 활용해 만들 수 있다.
    • 구현체에 InvocationHandler를 넣을 수 있는데, InvocationHandler 안에서 method.invoke 가 일어나게 된다.
    • 여러개의 InvocationHandler를 구현할 경우, InvocationHandler의 집합체를 또다른 InvocationHandler로 만들어서 구현하여 체인 형태로 실행시켜 만들 수 있다.
    • 이때 체인의 중간에 실제로 method.invoke가 일어나는 부분은 한곳만 있어야 하며 앞뒤로 일어날 일들을 정의하여 스프링의 @Before @After @Around 와 같은 기능을 구현할 수 있다.
    • 작동방식
      • Reflection - 구체적인 클래스 타입을 알지 못해도, 클래스의 정보에 접근하게 해주는 API
      • JVM이 실행되며 저장한 바이트코드를 활용해 필요한 정보를 가져온다.
      • 이 때문에 Reflection API는 자원을 많이 소모하여 성능이 떨어질 수 있다.
      • 하지만 클래스를 조작하지 않기 때문에 생성 비용은 적다.
  • CGLib
    • 클래스 기반으로 바이트코드를 조작하여 프록시를 생성한다.
    • ASM 이라는 자바 바이트코드 조작 분석 프레임워크를 사용한다. ⇒ 클래스의 동적 생성과 수정이 이루어진다.
    • 실제 클래스를 상속받아서 생성하기 때문에, 메소드 호출이 리플렉션이 아니라 직접적인 메소드 호출로 처리된다. ⇒ 빠르다
    • 클래스를 조작하기 때문에 생성 비용은 높을 수 있다.
    • 작동 방식
      • InvocationHandler를 사용하면 다이나믹 프록시와 같이 리플렉션을 통해 동작한다.
      • MethodInterceptor를 활용해 메서드를 가져와 사용하는 것이 성능면에서 좋다.

어떻게 사용해야 할까?

  • 우리가 흔히 아는 @Transactional 과 같은 기능을 수행해주는게 바로 AOP이다.
  • 실제 컴포넌트 스캔이 발생하면, 구현체를 올리는 것이 아니라 CGLib을 통해 만들어진 Proxy로 실행된다는 것을 알 수 있다.
  • 스프링 AOP를 사용하면 Proxy를 직접 이용하지 않아도 충분하지만, Proxy를 통해 더 자세한 설정이 가능하다는 것은 장점이라고 할만 하다.

출처

AOP란? 관점 지향 프로그래밍의 원리

[Spring] 스프링 AOP (Spring AOP) 총정리 : 개념, 프록시 기반 AOP, @AOP

[Java] Spring Boot AOP(Aspect-Oriented Programming) 이해하고 설정하기

@Transactional 과 PROXY

JDK Dynamic Proxy와 CGLib를 알아보자 #2

profile
실생활에 가치를 더하는 개발자

0개의 댓글