[Spring 입문하기] Section 07. AOP

2024. 1. 25. 13:17·Programming/Spring
728x90
반응형


✏️ 핵심 관심사항(core concer)과 공통 관심사항(cross-cutting concer)

  • 핵심관심사항 예) 은행서비스, 계좌서비스 , 소비자 소비스 등등
  • 공통관심사항(부가기능) 예)보안, 트랜잭션, 로그인 인증

✏️ AOP (Aspect Oriented Programming - 관점 지향 프로그래밍)

핵심 로직과 부가 기능을 분리하여 애플리케이션 전체에 걸쳐 사용되는 부가 기능을 모듈화하여 재사용할 수 있도록 지원하는 것

  • 기존 oop는 함수로 뺄 수 없는 공통적으로 처리하는 부가 기능 로직이 중복되는 한계가 있어 이를 해결하기 위해 AOP가 등장하게 되었다.
  • 이런 로직을 어스펙트(Aspect)라는 모듈 형태로 만들어서 설계하고 개발하는 방법이다.
  • 즉 핵심적인 기능에서 부가적인 기능을 분리하는 것이 AOP이다.
  • ex ) 간단한 메소드 성능검사( 시간측정 ), 트랜잭션 처리, 예외 반환, 아키텍처 검증 등
  • 주 메소드에서 부가기능을 시행하는 시점 5가지
    • around → 메소드 실행전, 실행후 두번 부가기능을 시행함
    • before → 메소드 실행전
    • after returning → 메소드가 정상적으로 실행 한 후
    • after throwing → 메소드가 예외를 발생시킨 후
    • after → 메소드 실행 후

✏️ Spring AOP

Spring AOP 용어

  • Target : 핵심기능을 담고 있는 모듈로 부가 기능을 부여할 대상이 된다.
  • Advice : 어느 시점에 어떤 공통관심기능(Aspect)을 적용할지 정의한 것 즉, 부가기능을 담고 있는 모듈
  • JoinPoint : Aspect가 적용될 수 있는 지점, 즉 부가기능을 적용할 수 있는 모듈(메소드 등등)
  • Pointcut : 공통 관심 사항이 적용될 JoinPoint, 부가기능(Advice)를 적용할 target의 메소드를 선별하는 정규 표현식이다
  • Aspect : 여러 객체에서 공통으로 적용되는 공통 관심 사항
    • AOP의 기본모듈이고 싱글톤 형태의 객체로 존재한다.
    • Aspect = Adivce + Pointcut
  • Advisor(spring aop에만 있음)
    • Advisor = Adivce + Pointcut
  • Weaving
    • 어떤 부가 기능(Advice)을 어떤 핵심사항(Pointcut)에 적용시킬에 대한 설정(Advisor)
    • 즉 포인트컷에 의해서 결정된 타겟의 joinpoin에 부가기능(adivce)을 삽입하는 과정

Spring AOP 특징

프록시 기반의 AOP를 지원

  • Spring은 타겟 객체에 대한 프록시를 만들어서 제공한다.
  • 타겟을 감싸는 프록시는 실행시간(Runtime)에 생성된다.
  • 프록시는 Advice를 타겟 객체에 적용하면서 생성되는 객체이다.
  • 프록시 객체를 쓰는 이유는 접근 제어 및 부가기능을 추가하기 위함이다

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

  • 전처리 Advice : 프록시는 타겟 객체에 대한 호출을 가로챈 다음 Advice의 부가 기능 로직을 수행한고 난 후 타겟의 핵심 기능 로직을 호출한다.(Object result = joinPoint.proceed();)
  • 후처리 Advice : 타겟의 핵심 기능 로직 메소드를 호출한 후에 부가 기능을 수행하는 경우도 있다.

Sprint AOP는 메소드 JoinPoint만 지원한다.

  • Spring은 동적 프록시 기반으로 AOP를 구현하므로 메소드 조인포인트만 지원한다. (즉 스프링 AOP의 조인포인트는 항상 메소드 실행시점이 된다)

시간측정 AOP 등록

package hello.hellospring.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class TimeTraceAop {
    @Around("execution(* hello.hellospring..*(..))")
    public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();
        System.out.println("START: " + joinPoint.toString());
        try {
            return joinPoint.proceed();
        } finally {
            long finish = System.currentTimeMillis();
            long timeMs = finish - start;
            System.out.println("END: " + joinPoint.toString()+ " " + timeMs +
                    "ms");
        }
    }
}
반응형

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

[Spring] 객체 지향 설계와 스프링  (1) 2024.01.28
[Spring] 스프링 프레임워크(Spring Framework)의 구조  (0) 2024.01.28
[Spring 입문하기] Section 06. 스프링 DB 접근 기술  (0) 2024.01.25
[Spring 입문하기] Section 04. 스프링 빈과 의존관계  (0) 2024.01.25
[Spring 입문하기] Section 03. 회원 관리 예제 - 백엔드 개발  (0) 2023.07.13
'Programming/Spring' 카테고리의 다른 글
  • [Spring] 객체 지향 설계와 스프링
  • [Spring] 스프링 프레임워크(Spring Framework)의 구조
  • [Spring 입문하기] Section 06. 스프링 DB 접근 기술
  • [Spring 입문하기] Section 04. 스프링 빈과 의존관계
제가안난데여♪(´ε`*)
제가안난데여♪(´ε`*)
기억의 유한함을 기록의 무한함으로 ✍️ 예비 개발자가 꿈꾸는 공간 여기는 안나의 개발 블로그 💻
  • 제가안난데여♪(´ε`*)
    안나의 전두엽 어딘가 🧠
    제가안난데여♪(´ε`*)
    기억의 유한함을 기록의 무한함으로 ✍️ 예비 개발자가 꿈꾸는 공간 여기는 안나의 개발 블로그 💻
  • 전체
    오늘
    어제
    • 분류 전체보기 (128)
      • 간단하게 한스푼🥄 (1)
      • Programming (56)
        • Spring (16)
        • Vue.js (6)
        • Deep Learning (3)
        • DataBase (5)
        • React (26)
      • DevOps (21)
        • Docker (12)
        • Linux (4)
      • Algorithm (46)
        • 알고리즘 정리 (5)
        • 자료구조 (0)
        • PS - 백준 (28)
        • 99클럽 코테 스터디 (13)
      • Project (0)
        • CampFire (0)
      • 안나의 취뽀일기 (˵ •̀ ᴗ - ˵ ) ✧ (4)
        • SSAFY_9기 (2)
        • SW 부트캠프 (2)
  • 잔디 달력

    «   2026/04   »
    일 월 화 수 목 금 토
    1 2 3 4
    5 6 7 8 9 10 11
    12 13 14 15 16 17 18
    19 20 21 22 23 24 25
    26 27 28 29 30
  • 인기 글

  • 태그

    java stack
    Vue.js 입문하기
    docker
    개발자 취업
    linux
    java
    greedy
    항해99
    알고리즘
    stack
    백준 java
    Vue.js
    Vue
    React
    자바 스택
    백준 구현문제
    백준
    til
    99클럽
    김영한
    리액트 상태
    java 백준
    도커컨테이너
    front-end
    코딩테스트 준비
    springboot
    topology sort
    자바
    Spring
    도커
  • 04-28 16:17
    반응형
  • hELLO· Designed By정상우.v4.10.3
제가안난데여♪(´ε`*)
[Spring 입문하기] Section 07. AOP
상단으로

티스토리툴바