AOP Spring Boot에서 사용하기

2023. 8. 17. 00:06· Spring, Spring Boot/AOP
목차
  1. 순서
  2. 의존성 추가
  3. Application에 Annotation 추가 
  4. 파일 생성
  5. 실행 시점

 

 

순서

AOP를 Spring Boot에서 실행하기 위해 다음의 단계들을 거칩니다.

  1. 의존성 추가
  2. Application에 Annotation 추가
  3. Aspect 파일 생성 
  4. 메소드 생성
    1. 실행 범위 지정
    2. 실행 코드 구현 

 

 

 

의존성 추가

implementation 'org.springframework.boot:spring-boot-starter-aop'

 

 

 

Application에 Annotation 추가 

@EnableAspectJAutoProxy 이 어노테이션을 어플리케이션 클래스에 추가합니다. 

@SpringBootApplication
@EnableAspectJAutoProxy // aop 사용
public class UserApplication {
	public static void main(String[] args) {
		SpringApplication.run(UserApplication.class, args);
	}
}

 

 

 

파일 생성

저 같은 경우는 aop 패키지를 생성하고 LoggingAspect.java 클래스 파일을 생성해 작업을 했습니다. 

 

  • @Aspect, @Component, @Slf4j 어노테이션 추가 
  • AOP 메소드 생성 

 

 

 

전체 코드

package com.dotd.user.aop;


import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Aspect
@Component
@Slf4j
public class LoggingAspect {

    // Before : 메소드 실행 전
    @Before("execution(* com.dotd.user.controller..*(..))")
    public void logBefore(JoinPoint joinPoint) {
        log.info("Before 실행 : {}", joinPoint.getSignature().toShortString() );
    }

    // After : 메소드 실행 후
    @After("execution(* com.dotd.user.controller..*(..))")
    public void logAfter(JoinPoint joinPoint) {
        log.info("After 실행 : {}", joinPoint.getSignature().toShortString() );
    }

    // AfterReturning : 메소드가 실행하고 반환된 후 실행
    // returning 은 결과값을 받을 객체를 선택
    @AfterReturning(value = "execution(* com.dotd.user.controller..*(..))", returning = "result")
    public void logAfterReturning(JoinPoint joinPoint, Object result) {
        log.info("AfterReturning 실행 : {} + 결과 : {}", joinPoint.getSignature().toShortString(), result);
    }

    // AfterThrowing : 메소드에 예외가 발생했을 때 실행
    // throwing 은 예외값을 받을 객체를 선택
    @AfterThrowing(pointcut = "execution(* com.dotd.user.controller..*(..))", throwing = "e")
    public void logAfterThrowing(JoinPoint joinPoint, Throwable e) {
        log.info("AfterThrowing 실행 : {} + 예외 : {}", joinPoint.getSignature().toShortString(), e);
    }


    // Around :  실행 전, 후
    @Around("execution(* com.dotd.user.controller..*(..))")
    public Object logAroundControllerMethods(ProceedingJoinPoint joinPoint) throws Throwable {
        long startTime = System.currentTimeMillis();
        log.info("Around 시작 : {}", joinPoint.getSignature().toShortString());

		// 실제 메서드 실행
		// 이 코드를 기준으로 전, 후가 나누어짐
        Object result = joinPoint.proceed();  

        long elapsedTime = System.currentTimeMillis() - startTime;
        log.info("Around 끝 : {} / 걸린 시간 :  {} ms", joinPoint.getSignature().toShortString(), elapsedTime);
        return result;
    }
}

 

 

메소드 

    @Before("execution(* com.dotd.user.controller..*(..))")
    public void logBefore(JoinPoint joinPoint) {
        log.info("Before 실행 : {}", joinPoint.getSignature().toShortString() );
    }

메소드의 각각 요소들에 대해 알아보겠습니다.

 

 

    @Before("execution(* com.dotd.user.controller..*(..))")
  • @Before : @뒤에 AOP메소드의 실행 지점을 설정합니다. (After, AfterReturning, Around .. )
  • "execution(* com.dotd.user.controller..*(..))" 은 AOP를 적용할 대상을 뜻 합니다. 
  • 여기서는 com.dotd.user.controller 의 패키지와 하위 패키지에 적용합니다. 

 

 

public void logBefore(JoinPoint joinPoint) {
    log.info("Before 실행 : {}", joinPoint.getSignature().toShortString() );
}
  • JoinPoint joinPoint 은 프로그램 실행 중에 특정 위치를 말합니다. 즉, Advice(AOP의 코드)를 삽입할 수 있는 프로그램의 특정 지점을 의미합니다. 
  • joinPoint.getSignature().toShortString() : join point에 대해 짧은 문자열로 반환 

 

 

 

 

실행 시점

AOP 실행 순서

 

Around 전 -> Before -> 로직 -> AfterReturning -> After -> Around 후

이 순서로 실행되는 것을 볼 수 있습니다. 

 

 

 

 

 

 

 

 

 

  1. 순서
  2. 의존성 추가
  3. Application에 Annotation 추가 
  4. 파일 생성
  5. 실행 시점
'Spring, Spring Boot/AOP' 카테고리의 다른 글
  • AOP 개념
너지살
너지살
너지살
너지살개발자
너지살
전체
오늘
어제
  • 분류 전체보기 (375)
    • 잡식 (2)
      • 티스토리 (2)
    • 개발 일지 (0)
      • OMS 프로젝트 (4)
      • 우테코 6기 프리코스 (1)
    • Git (2)
    • JAVA (15)
      • Java 공부 (6)
      • 자료구조 (4)
      • 도움되는 메모 (4)
    • DevOps (18)
      • AWS (6)
      • Docker (2)
      • Jenkins (1)
      • Nginx (1)
      • Kafka (6)
      • RabbitMQ (2)
    • Spring, Spring Boot (16)
      • Test Code (1)
      • AOP (2)
      • Batch (3)
      • Cache - Redis (5)
      • Cloud Config - 설정 파일 관리 (3)
      • 성능 측정 (1)
      • 예외 처리 (1)
    • BackEnd (1)
      • Spring 공부 (1)
      • Thymeleaft (0)
    • DB (17)
      • JPA (2)
      • DB 공부 (3)
      • DB 포스팅 (4)
      • DB 답장 (1)
      • MySQL (2)
      • Redis (5)
      • MongoDB (0)
    • CS (8)
      • Spring (4)
      • DataBase (3)
      • Java (1)
    • Algorithm (203)
      • 알고리즘 개념 (5)
      • 정렬 알고리즘 (11)
      • 프로그래머스 문제풀이 (18)
      • 백준 문제풀이 (165)
      • 소프티어 문제풀이 (3)
      • 알고리즘 시험 정리 (1)
    • SQL (0)
      • 문법 (1)
      • 프로그래머스 문제풀이 (52)
      • 리트코드 문제풀이 (19)
    • IT (1)
      • IT 공부 (1)
    • 정리 (10)
      • 질문 정리 (10)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 데이터베이스
  • Spring Boot Redis 연결
  • dynamic programing
  • 깊이/너비 우선탐색
  • 자료구조
  • 그래프 탐색
  • DFS
  • Spring Boot
  • Next permutation
  • Java 정리
  • 투포인트
  • Test code
  • 질문 정리
  • 분리 집합
  • 크루스칼 알고리즘
  • 알고리즘
  • 병렬 처리
  • DP
  • 외판원 순회 문제
  • Sorting algorithm
  • 경로표현식
  • 다음 순열 찾기
  • dynamiceprogramming
  • MST
  • 부분탐색
  • 백준
  • 투 포인터
  • JPA
  • 다이나믹프로그래밍
  • 비트마스킹
  • cache
  • 두 포인터
  • 최소 신장 트리
  • 그래프 이론
  • redis
  • 다이나믹 프로그래밍
  • db
  • 소프티어
  • git
  • 설정
  • 유니온파인드
  • two pointer
  • 최소 스패닝 트리
  • Bitmast
  • Spring Batch
  • docker
  • Java
  • Union-Find
  • Algorithm
  • 우선수위큐

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
너지살
AOP Spring Boot에서 사용하기
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.