프로그래밍 공부/Spring

AOP와 Spring AOP

Wonuk 2022. 12. 29. 20:55
반응형
본 포스팅은 우아한 테크코스
10분 테코톡 봄의 AOP와 Spring AOP를 기반으로
작성된 포스팅입니다.

https://www.youtube.com/watch?v=hjDSKhyYK14&list=PLgXGHBqgT2TvpJ_p9L_yZKPifgdBOzdVH&index=9


 

AOP란?

흔히 Spring을 학습하다보면 AOP에 대해 공부하게 될텐데

이는 Spring에만 존재하는 개념이 아닙니다.

 

예시)

인터페이스

 

구현체

반복문으로 factorial 연산을 진행

이때 새로운 요구사항이 발생합니다.

위의 요구사항을 위해

System.out.print()를 사용합니다.

 

위 상태에서 새로운 요구사항이 또 등장합니다.

 

RecursiveCalculator 구현

 

실행 시간 측정을 위해서

구현체들에 시간 측정 메소드를 작성하는것이 아니라

호출하는쪽 코드에 실행시간 측정 코드를 넣어주었습니다.

 

이때 새로운 요구사항 또 등장!

 

기존의 코드에서 시간을 모두 바꾸어주어야 합니다.

 

위 방법으로 해결하려면

기존의 코드들이 수정되어야 하고, 코드의 중복이 발생합니다.

 

이를 해결하기 위해 프록시를 사용합니다.

 


프록시란?

 

예시)

 

코드실행

 

코드 실행흐름

 

프록시를 사용하여 코드를 구현

  1. 기존 코드를 변경하지 않고 실행 시간을 출력할 수 있습니다.
  2. 실행 시간을 구하는 코드의 중복이 제거됩니다.

 

정리

 

핵심 기능과 부가기능을 분리합니다.

 

부가 기능의 공통된 부분을 추출하는것이 AOP의 개념입니다.

 

 

위 사진에서 부가 기능은 가로 방향의 공통부분만 추출했기 때문에

횡당 관심사 라고도 부릅니다.

 

 

 

 

AOP 용어 정리

참고로 하단의 용어는 Spring에서만 사용되는것이 아닌

AOP에 사용되는 용어들입니다.

 

 

 

예시)

더하기, 빼기 메소드가 추가

이때 메소드들은 join point라고 할 수 있습니다.

부가 기능을 어디에 적용할지 정하는것이 point cut입니다.

 

 

 

Spring에서의 AOP 용어 정리

 

 

AOP를 구현하는 방법에는 어떤것들이 있는가?

  1. 컴파일 시점에 코드에 공통 기능 삽입
  2. 클래스 로딩 시점에 바이트 코드에 공통 기능 삽입
  3. 런타임 시점에 프록시 객체를 생성하여 공통 기능 삽입

컴파일과 클래스 로딩 시점에는

AOP 프레임워크인 AspectJ가 제공하는 컴파일러나 클래스 로더 조작기같은

새로운것을 사용함으로써 유연한 AOP를 구현할 수 있지만

부가적인 의존성을 추가해야 한다는 단점이 있습니다.

 

 

런타임 시점은 이미 자바언어가 시작된 시점으로

자바언어에서 제공하는 기능인 프록시를 사용하여

공통 기능을 구현하면 됩니다.

 

스프링 AOP는 어떠한 방식으로 구현되는가?

 

Spring에서 AOP를 구현하는 방법

  • 런타임 시점에 프록시 객체를 생성하여 공통 기능 삽입

스프링에서는 아래와같은 다양한 기술을 조합하여

Spring AOP를 지원합니다.

 

Spring에서 AOP를 사용하는 방법

필수적으로 빈으로 등록하여야 AOP를 사용할 수 있습니다.

@Aspect 어노테이션을 붙이고

메서드 이름이 fact~로 시작하는 경우라는 Point Cut을 정의합니다.

Aspect도 마찬가지로 Bean으로 등록이 필요합니다.

 

@Around

 

 

테스트 코드

테스트 코드 실행 결과

fact~로 시작하는 메소드만 실행시간이 측정됨.

반응형

'프로그래밍 공부 > Spring' 카테고리의 다른 글

Spring Cloud Netflix Eureka  (0) 2023.02.02
Spring Cloud란?  (0) 2023.01.31
Spring Security란?  (0) 2022.01.19
Spring 컴포넌트 스캔, 의존관계 자동주입  (0) 2021.12.31
Spring 싱글톤 컨테이너  (0) 2021.12.30