Spring/[인프런 김영한 스프링 핵심 원리 - 고급편]

[인프런 김영한 스프링 핵심 원리 - 고급편] 스프링 AOP 개념

h2boom 2024. 12. 16. 11:27

스프링 AOP

AOP 소개 - 핵심 기능과 부가 기능

  • 애플리케이션 로직은 핵심 기능과 부가 기능으로 나눌 수 있다.
    • 핵심 기능 : 해당 객체가 제공하는 고유 기능이다.
      • ex) 주문 로직 기능
    • 부가 기능 : 단독으로 사용되지 않고 핵심 기능을 보조하기 위해 제공되는 기능이다.
      • ex) 트랜잭션 기능, 로그 추적 기능

 

  • 여러 곳에서 공통으로 사용하는 부가 기능의 경우 횡단 관심사(cross-cutting concerns)가 된다.

 

  • 부가 기능 적용 시 반복, 중복 코드, 수정으로 많은 문제가 발생한다.

AOP 소개 - Aspect

  • Aspect : 핵심 기능과 부가 기능을 분리해서 한 곳에서 관리하도록 하고 부가 기능과 해당 부가 기능을 어디에 적용할지 정의한 것
    • @Aspect, 스프링이 제공하는 Advisor도 하나의 Aspect이다.
    • Aspect는 관점으로 애플리케이션을 보는 관점을 하나하나의 기능에서 횡단 관심사 관점으로 다르게 보는 것
    • ex) 로그 출력 기능을 모든 컨트롤러에 적용

 

  • 관점 지향 프로그래밍 AOP (Aspect-Oriented Programming) : Aspect를 사용한 프로그래밍 방식이다.
    • OOP를 대체하기 위한 것이 아닌 횡단 관심사를 깔끔하게 처리하기 어려운 OOP의 단점을 보조하는 목적
    • AOP의 대표적인 구현으로 AspectJ 프레임워크가 있다.
      • 횡단 관심사의 깔끔한 모듈화 - (오류 검사 및 처리, 동기화, 성능 최적화(캐싱), 모니터링 및 로깅)

AOP 적용 방식

  • AOP 사용 시 핵심 기능과 부가 기능이 코드상 완전히 분리되어 관리된다.

 

  • AOP 사용 시 부가 기능 로직을 실제 로직에 추가하는 방법
    • 컴파일 시점 (위빙(Weaving)) : 부가 기능 코드가 핵심 기능이 있는 컴파일된 코드 주변에 붙는 것과 같다.
      • .java 소스코드를 컴파일러로 .class 만드는 시점에 부가 기능 로직 추가
      • 단점 : AspectJ가 제공하는 컴파일러를 사용해야 하며 복잡하다.
    • 클래스 로딩 시점 (로드 타임 위빙) : 자바 실행 시 .class 파일을 JVM 내부의 클래스 로더에 보관하는데 중간에 .class 파일을 조작해서 JVM에 올리는 방식이다.
      • 자바 언어에서 .class를 JVM에 저장하기 전 조작하는 기능을 제공한다.
      • 주로 모니터링 툴들이 사용하는 방식이다.
      • 단점 : 자바 실행 시 특별한 옵션 (java -javaagent)을 통해 클래스 로더 조작기를 지정해야하므로 번거롭고 어렵다.
    • 런타임 시점(런타임 위빙) : 프록시 방식의 AOP로 스프링 컨테이너, 프록시, DI, 빈 후처리기 등의 기능을 사용하는 방식이다.
      • 스프링만 있으면 AOP를 적용할 수 있다.

 

  • 부가 기능 적용 차이점
    • 컴파일 시점 - 실제 대상 코드에 Aspect를 통한 부가 기능 호출 코드가 포함되며 AspectJ를 직접 호출해야 한다.
    • 클래스 로딩 시점 - 실제 대상 코드에 Aspect를 통한 부가 기능 호출 코드가 포함되며 AspectJ를 직접 호출해야 한다.
    • 런타임 시점 - 실제 대상 코드는 그대로 유지되며 프록시를 통해 부가 기능이 적용되기에 항상 프록시를 통해서 사용할 수 있다. (스프링 AOP가 사용하는 방식)

 

  • 조인 포인트 : AOP를 적용가능한 지점

 

  • AOP 적용 위치
    • 적용 가능 지점(조인 포인트) : 생성자, 필드 값 접근, static 메소드 접근, 메소드 실행
    • AspectJ를 직접 사용하는 컴파일 시점과 클래스 로딩 시점에 적용하는 AOP는 바이트 코드를 직접 조작하기에 모든 지점에 AOP를 적용할 수 있다. 
    • 프록시 방식을 사용하는 스프링 AOP는 메소드 실행 지점에만 AOP를 적용할 수 있다.
      • 프록시는 메소드 오버라이딩 개념으로 동작하기에 생성자, static 메소드 , 필드 값 등에는 적용될 수 없다.
      • 스프링 AOP의 조인 포인트는 메소드 실행으로 제한된다.
      • 스프링 AOP는 스프링 컨테이너가 관리할 수 있는 스프링 빈에만 AOP를 적용할 수 있다.

 

  • 스프링은 AspectJ를 직접 사용하는 것이 아닌 문법만 차용하고 프록시 방식의 AOP를 적용한다.

AOP 용어

  • 조인 포인트 (Join point) : AOP를 적용할 수 있는 모든 지점
    • 어드바이스가 적용될 수 있는 위치, 메소드 실행, 생성자 호출, 필드 값 접근, static 메소드 접근과 같은 프로그램 실행 중 지점
    • 스프링 AOP는 프록시 방식을 사용하기에 항상 메소드 실행 지점이 조인포인트이다.

 

  • 포인트컷 (Pointcut) : 조인 포인트 중 어드바이스가 적용될 위치를 선별하는 기능
    • 주로 AspectJ 표현식 사용
    • 스프링 AOP는 메소드 실행 지점만 포인트컷으로 선별 가능하다.

 

  • 타겟 (Target) : 어드바이스(부가 기능)를 받는, 포인트컷으로 결정하는 객체
    • 프록시가 호출하는 실제 대상 객체

 

  • 어드바이스 (Advice) : 특정 조인 포인트에서 Aspect에 의해 취해지는 조치 (=부가 기능)
    • Around, Before, After와 같은 다양한 종류의 어드바이스가 있다.

 

  • 애스펙트 (Aspect) : 어드바이스 + 포인트컷을 모듈화한 것 (=@Aspect)
    • 여러 어드바이스와 포인트컷이 함께 존재할 수 있다.

 

  • 어드바이저 (Advisor) : 하나의 어드바이스와 하나의 포인트컷으로 구성
    • 스프링 AOP에서만 사용되는 용어이다.

 

  • 위빙 (Weaving) : 포인트컷으로 결정한 타겟의 조인 포인트에 어드바이스를 적용하는 것
    • AOP 적용을 위해 애스펙트 객체에 연결한 상태
    • 위빙을 통해 핵심 기능 코드에 영향을 주지 않고 부가 기능을 추가할 수 있다.
    • 종류
      • 컴파일 타임 (AspectJ Compile 방식)
      • 로드 타임
      • 런타임 (프록시 방식)

 

  • AOP 프록시 : AOP 기능을 구현하기 위해 만든 프록시 객체
    • 스프링에서 AOP 프록시는 JDK 동적 프록시 또는 CGLIB 프록시이다.


정리

  • Aspect : 핵심 기능과 부가 기능을 분리해서 한 곳에서 관리하도록 하고 부가 기능과 해당 부가 기능을 어디에 적용할지 정의한 것
    • 어드바이스와 포인트컷을 모듈화한 것 = @Aspect
    • Aspect를 만들어서 횡단 관심사를 해결한다. 
  • 관점 지향 프로그래밍 AOP (Aspect-Oriented Programming) : Aspect를 사용한 프로그래밍 방식이다.
  • AOP 사용 시 핵심 기능과 부가 기능이 코드상 완전히 분리되어 관리된다.

 

  • 부가 기능 적용 방식과 차이점
    • 클래스 로딩 시점 / 컴파일 시점 - 실제 대상 코드에 Aspect를 통한 부가 기능 호출 코드가 포함되며 AspectJ를 직접 호출해야 한다.
      • 컴파일 시점 : .java 소스코드를 컴파일러로 .class 만드는 시점에 부가 기능 로직 추가
      • 클래스 로딩 시점 : 자바 실행 시 .class 파일을 JVM 내부의 클래스 로더에 보관하는데 중간에 .class 파일을 조작해서 JVM에 올리는 방식
    • 런타임 시점 - 실제 대상 코드는 그대로 유지되며 프록시를 통해 부가 기능이 적용되기에 항상 프록시를 통해서 사용할 수 있다. (스프링 AOP가 사용하는 방식)
      • 스프링 AOP의 적용 가능한 지점(조인 포인트)은 프록시 방식이기에 메소드 실행으로 제한된다.
      • 스프링 AOP는 스프링 컨테이너가 관리할 수 있는 스프링 빈에만 AOP를 적용할 수 있다.

출처 : [인프런 김영한 스프링 핵심 원리 - 고급편]

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B3%A0%EA%B8%89%ED%8E%B8/dashboard

 

스프링 핵심 원리 - 고급편 강의 | 김영한 - 인프런

김영한 | 스프링의 핵심 원리와 고급 기술들을 깊이있게 학습하고, 스프링을 자신있게 사용할 수 있습니다., 핵심 디자인 패턴, 쓰레드 로컬, 스프링 AOP스프링의 3가지 핵심 고급 개념 이해하기

www.inflearn.com