Carnival7
Change Developer
Carnival7
전체 방문자
오늘
어제
  • 분류 전체보기
    • 자바의 정석
    • 프로그래밍 언어별 tools
      • 파이썬
      • 자바
    • 코딩 테스트
      • 백준 강의 기초편
      • 백준 강의 연습편
      • 백준 강의 문제편
      • 삼성 기출
      • 백준 - 일반
      • 카카오 기출
      • 프로그래머스 - 일반
      • 코테 풀이 Tools
    • CS
      • Network
      • 운영체제
      • 알고리즘
      • DB
    • Web_Backend
      • Spring
      • 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
      • 스프링 핵심 원리 - 기본편
    • DevOps
    • IT 업무 지식
      • 인프라
      • 클라우드
    • 자격증
      • AWS - CLF
      • 정처기 - 실기
    • 생각 정리

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • ci/cd
  • 스프링 부트 무중단 웹 서비스
  • nginx
  • 코딩테스트 #삼성기출 #구현 #시뮬레이션
  • code deploy
  • 슬라이딩 윈도우 #덱
  • 삼성기출 #백준강의문제편
  • 스프링 #AOP
  • DMZ
  • 삼성기출 #2023 #상반기
  • DevOps
  • 알고리즘 #백준강의기초편 #코딩테스트
  • Github Actions
  • 프로그래머스 #카카오기출 #레벨2
  • 슬라이딩 윈도우
  • 스프링 #인터셉터 #AOP #필터

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Carnival7

Change Developer

Web_Backend/Spring

3.Spring AOP

2024. 7. 12. 13:29

Spring AOP


  • Spring AOP
    • AOP(Aspect Oriented Programming, 관점 지향 프로그래밍)
      • 관점의 구분
      • AOP 목적
      • AOP 주요 용어
        • Weaving 구분
        • AOP 프레임워크
    • Spring AOP 의 구현
      • Spring AOP 의 구현 방식
      • Advice 종류
    • Spring AOP 특징
      • 프록시 (Proxy) 기반 AOP 지원
      • 프록시가 호출을 가로챈다(Intercept)
      • Spring AOP 는 메서드 조인 포인트만 지원

AOP(Aspect Oriented Programming, 관점 지향 프로그래밍)

애플리케이션에서의 관심사의 분리(기능의 분리)를 구현, 즉 핵심 기능에서 부가 기능을 분리하고, 분리한 부가 기능을 Aspect라는 모듈로 만들어 설계/개발한다.

관점의 구분

  • 핵심 관점 : 비즈니스 로직

  • 부가 관점 : 핵심 로직을 실행하기 위한 부가 기능(데이터베이스 연결, 로깅, 파일 입출력 등)

AOP 목적

  • 소스 코드에서 여러 번 반복해서 쓰는 코드(= 흩어진 관심사, Concern)를 Aspect로 모듈화하여 핵심 로직에서 분리 및 재사용

  • 개발자가 핵심 로직에 집중

AOP 주요 용어

  • Aspect

    • Advice + PointCut
    • 부가 기능을 정의한 코드인 어드바이스(Advice)와 어드바이스를 어디에 적용할지를 결정하는 포인트컷(PointCut)을 합친 개념
    • 구분된 애스팩트를 런타임 시 필요한 위치에 동적으로 실행
  • Target

    • Aspect를 적용하는 곳(클래스, 메소드 등)
  • Advice

    • 타겟에 제공할 수행 기능을 담은 구현체
  • JoinPoint

    • Advice가 적용될 위치

      • 타겟 객체가 구현한 인터페이스의 모든 메소드는 조인 포인트의 후보다.

      • 조인포인트를 사용해 메소드의 세부 정보(이름과 인수)를 얻을 수 있다.

        • ex. 메소드 진입 시, 생성자 호출 시, 필드에서 값 꺼낼 때 등
  • PointCut

    • JoinPoint의 상세 스펙 정의

      • 어드바이스를 적용할 타겟의 메소드를 선별하는 정규표현식
        • 더욱 구체적으로 Advice가 실행될 지점 지정
        • execution으로 시작하고, 메소드의 Signature를 비교하는 방법 주로 이용
    • PointCut 표현식 문법
      image

    • PointCut 표현식 예시
      image
      image
      image

  • Weaving

    • PointCut에 의해 결정된 Target의 JoinPoint에 Advice를 삽입하는 과정

    • 위빙은 AOP가 핵심기능 타겟의 코드에 영향을 주지 않으면서 필요한 부가기능(어드바이스)을 추가할 수 있도록 해주는 핵심적인 처리과정이다.

      image

Weaving 구분

  1. 컴파일 타임 위빙

    1. 자바 파일을 클래스 파일로 만들 때 Advice 소스가 추가되어 조작된 바이트 코드 생성하는 방법
    2. 입력은 소스 코드고 출력은 위빙이 있는 컴파일된 클래스이다.
    3. AspectJ가 사용하는 방법
  2. 바이너리 위빙

    1. 컴파일 후 컴파일 된 클래스를 로딩하는 시점에 Advice 소스를 끼워넣는 방법
    2. 코드가 컴파일된 후에 수행된다.
    3. 입력은 컴파일된 클래스 파일 또는 jar 파일이고 출력은 위빙이 있는 컴파일된 클래스나 jar 파일이다.
    4. AspectJ가 사용하는 방법
  3. 런타임 위빙

    1. 클래스가 JVM에 로드되기 직전에 수행된다.
    2. Spring AOP가 사용하는 방법
    3. 스프링은 런타임 시 Bean 생성
    4. A라는 Bean 만들 때 A라는 타입의 프록시 Bean도 생성하고, 프록시 Bean이 A의 메소드 호출 직전에 Advice 소스를 호출한 후 A의 메소드 호출

AOP 프레임워크

  • AspectJ
    • 컴파일 타임 위빙을 제공한다.
    • 위빙을 수행하기 위해 AspectJ 컴파일러를 빌드 프로세스에 추가할 수 있다.
  • 스프링 AOP
    • AspectJ와 자체의 몇 가지 기본 AOP 기능과의 통합을 제공한다.
    • 런타임 위빙을 수행한다.
    • 스프링 빈에서 메소드 호출만 인터셉트할 수 있다.

스프링 빈으로 작업 중이고 스프링 빈에서 메소드 호출을 인터셉트하려는 경우, 스프링 AOP면 충분하다.

스프링 컨테이너에 의해 관리되지 않는 객체의 메소드 호출을 가로채려면 AspectJ를 사용해야 한다.

Spring AOP 의 구현

Spring AOP 의 구현 방식

  1. XML 기반의 POJO 클래스를 이용한 AOP 구현
    1. 부가기능을 제공하는 Advice 클래스를 작성한다
    2. XML 설정 파일에 <aop:config> 를 이용해서 애스펙트를 설정한다 .(즉 , 어드바이스와 포인트컷을 설정함 )
  2. @Aspect 어노테이션을 이용한 AOP 구현
    1. @Aspect 어노테이션을 이용해서 부가기능을 제공하는 Aspect 클래스를 작성한다. 이때 Aspect 클래스는 어드바이스를 구현하는 메서드와 포인트컷을 포함한다
    2. XML 설정 파일에 <aop:aspectj autoproxy/>> 를 설정한다.

Advice 종류

  • @Around
    • 타겟의 메소드가 호출되기 이전/이후 시점에 모두 처리해야 할 부가기능 정의
    • 조인포인트 앞/뒤에서 실행되는 어드바이스
  • @Before
    • 타겟의 메소드가 호출되기 이전 시점에 모두 처리해야 할 부가기능 정의
    • 조인포인트 앞에서 실행되는 어드바이스
  • @After
    • 타겟의 메소드가 호출된 이후 시점에 모두 처리해야 할 부가기능 정의
    • 조인포인트 뒤에서, 즉 메소드 실행 후, 메소드가 예외를 발생시키더라도 실행된다.
  • @After Returning
    • 타겟의 메소드가 실행된 이후 시점에 모두 처리해야 할 부가기능 정의
    • 조인포인트 실행 종료된 이후 실행되는 어드바이스
  • @After Throwning
    • 타겟의 메소드가 예외를 발생한 이후 시점에 모두 처리해야 할 부가기능 정의
    • 예외가 던져질 때 실행되는 어드바이스

Spring AOP 특징

프록시 (Proxy) 기반 AOP 지원

  • Spring은 타겟 (target) 객체에 대한 프록시를 만들어 제공한다
  • 타겟을 감싸는 프록시는 실행시간 (런타임) 에 생성된다
  • 프록시는 어드바이스를 타겟 객체에 적용하면서 생성되는 객체이다.
    image

프록시가 호출을 가로챈다(Intercept)

  • 프록시는 타겟 객체에 대한 호출을 가로챈 다음 어드바이스의 부가기능 로직을 수행하고 난 후에 타겟의 핵심기능 로직을 호출한다.(전처리 어드바이스)
  • 또는 타겟의 핵심기능 로직 메서드를 호출한 후에 부가 기능(어드바이스)을 수행하는 경우도 있다(후처리 어드바이스)
    image

Spring AOP 는 메서드 조인 포인트만 지원

  • Spring은 동적 프록시를 기반으로 AOP 를 구현하므로 메서드 조인 포인트만 지원한다. 즉 핵심기능 타겟의 메서드가 호출되는 런타임 시점에만 부가기능(어드바이스)을 적용할 수 있다 .
  • 반면에 AspectJ 같은 고급 AOP 프레임워크 를 사용하면 객체의 생성 , 필드값의 조회와 조작 , static 메서드 호출 및 초기화 등의 다양한 작업에 부가기능을 적용할 수 있다.

Reference

  • [Spring] 스프링 AOP (Spring AOP) 총정리 : 개념, 프록시 기반 AOP, @AOP
  • [Spring] AOP란?
  • Spring AOP, Aspect 개념 특징, AOP 용어 정리

'Web_Backend > Spring' 카테고리의 다른 글

5.SpringBoot  (0) 2024.07.12
4.Spring MVC  (0) 2024.07.12
2.Spring DI  (0) 2024.07.12
1.Spring Framework와 IoC  (0) 2024.07.12
AOP  (0) 2022.05.03
    'Web_Backend/Spring' 카테고리의 다른 글
    • 5.SpringBoot
    • 4.Spring MVC
    • 2.Spring DI
    • 1.Spring Framework와 IoC
    Carnival7
    Carnival7

    티스토리툴바