Spring AOP 간단 정리

Seop·2023년 8월 16일
0

Spring

목록 보기
3/4
post-thumbnail
post-custom-banner

AOP?

컴퓨팅에서 관점 지향 프로그래밍(aspect-oriented programming, AOP)은 횡단 관심사(cross-cutting concern)의 분리를 허용함으로써 모듈성을 증가시키는 것이 목적인 프로그래밍 패러다임이다. 코드 그 자체를 수정하지 않는 대신 기존의 코드에 추가 동작(어드바이스)을 추가함으로써 수행하며, "함수의 이름이 'set'으로 시작하면 모든 함수 호출을 기록한다"와 같이 어느 코드가 포인트컷(pointcut) 사양을 통해 수정되는지를 따로 지정한다. 이를 통해 기능의 코드 핵심부를 어수선하게 채우지 않고도 비즈니스 로직에 핵심적이지 않은 동작들을 프로그램에 추가할 수 있게 한다. 관점 지향 프로그래밍은 관점 지향 소프트웨어 개발의 토대를 형성한다

관점 지향 프로그래밍 - 위키백과

AOP 횡단 관심사(Cross-cutting concern)를 통해 모듈성을 증가시키는 프로그래밍 패러다임입니다.

https://www.codejava.net/frameworks/spring/understanding-spring-aop

AOP vs OOP

그런데 기존에 잘 알고 있던 개념중에 모듈화를 잘 사용하는 개념이 존재합니다!! 바로 객체지향 프로그래밍이죠(Object Oriented Programming, OOP) AOP와 OOP는 어떻게 다른 걸까요??

객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다

위키 백과 - 객체 지향 프로그래밍

OOP는 모든 대상을 객체로 바라보면서 컴퓨터 프로그램을 제작하는 패러다임입니다.
그에 반해 AOP는 코드의 수정 없이 기능을 추가하는 패러다임이죠.
쉽게 말해 핵심 기능은 건들이지 않고 부가적인 기능을 추가하고자 할 때, 주로 사용하는 기법입니다.
이미 OOP가 적용된 상태라고 할 수 있습니다.

따라서 OOP가 더 큰 개념이라고 생각하면 될 듯 하네요

그리고 기능 추가의 방식에도 차이가 존재합니다.
OOP에서 다른 모듈의 기능을 가져오기 위해서는 상속이나 조합(Composition)을 사용합니다.
하지만 AOP는 이와 다르게 어노테이션을 통해 사용할 수 있죠!

AOP의 목적

그렇다면 AOP를 적용해서 얻을 수 있는 장점은 무엇이 있을까요??
크게 2가지가 있습니다.

Avoid tangling

  • 비즈니스 로직과 횡단 관심사를 분리한다

Avoid scattering

  • 코드의 중복을 방지한다

AOP로 추가하고자 하는 코드는 주로 핵심 비즈니스 로직이 아닌 부가적인 기능일 때가 많고, 많은 곳에서 사용되는 코드인 경우가 많습니다.
그렇기 때문에 AOP를 통해서 비즈니스 로직은 건들지 않으면서 부가 기능으 추가하고자 할 때, 불필요한 코드의 중복을 피하고자 할 때 AOP를 주로 사용하죠!

AOP의 사용 예시

  • Auditing
  • Security
  • Transaction management
  • Logging
  • Caching
  • Internationalization
  • Error detection and correction
  • Memory management
  • Performance monitoring
  • Measuring statistics
  • Synchronization

DB 연결이 AOP가 아니다?

처음 AOP가 사용되는 곳들 봤을 때, 저는 DB 연결에도 AOP를 적용시킬 수 있지 않을까? 라는 생각을 했습니다.

하지만 다시 한 번만 더 생각을 해보니 DB연결에 적용시키기에는 다소 부적절하다는 생각을 했습니다.
모든 Layer에서 DB연결이 필요한 것도 아니고, 딱히 DB연결로 인한 코드의 중복도 심하지 않기 때문이죠.

그리고 Chat-GPT 말로는 Spring JDBC 가 DB 연결을 모두 관철하고 있으므로 불필요다는 답변을 줬습니다.

생각해보니 너무 당연하게도 AOP에 적용시키기에 그렇게 적절해 보이지는 않는군요
처음 봤을 때, DB는 많은 부분이 사용해서 AOP를 적용시킬 생각을 했었나 봅니다.

AOP 용어

Target

  • 핵심 기능을 담고 있는 모듈로서 부가기능을 부여할 대상

Join Point

  • 메소드의 실행이나 예외 처리와 같은 프로그램의 실행 중의 포인트
  • Spring AOP에서 Join Point는 항상 메소드 실행을 의미한다.
  • 어드바이스가 적용될 수 있는 위치

Aspect

  • Aspect은 일련의 관심사를 모듈화하는 Java 클래스
  • Aspect = Advice + Pointcut
  • Java 클래스 위에 @Aspect를 써서 선언할 수 있음
  • 클래스 내부의 메소드들은 @advice 어노테이션을 통해 advice가 될 수 있음
  • @Before, @After, @Around., @AfterReturning, @AfterThrowing 등이 있음

어노테이션 별 적용 시점

Pointcut

  • 어드바이스를 적용할 타겟의 메서드를 선별하는 정규표현식
  • 새로운 behavior가 적용될 코드의 포인트를 표시해줌
  • 포인트컷 표현식은 execution으로 시작하고 메서드의 Signature를 비교하는 방법을 주로 이용함
  • && (and), || (or), ! (not) 과 같은 논리 연산자를 사용할 수 있다.

Advice

  • 특정 Join Point에 실행되는 Aspect
  • 무엇을 해야하는지와 언제 실행해야하는지를 정의함
  • Spring에서는 Aspect를 빈으로 등록해서 사용함
  • Spring은 adviceInterceptor로 동작함

Weaving

  • 사용자의 Target Advice ObjectAspect를 적용시키는 과정
  • Spring AOP : Dynamic Proxy에 의해서 런타임 시점에 발생한다.
  • AspectJ : 컴파일 시점, 클래스 로딩 시점, 런타임 시점 모두를 지원한다.

이렇게 딱딱한 용어로만 보면 잘 이해가 되지 않는군요
그럼 그림을 통해 보면서 이해해보도록 해보겠습니다.

프로그램이 실행되면서 여러 개의 메소드가 실행되겠죠, 이것들이 Join Point입니다.
그리고 여기에 적용하고 싶은 부가 기능이 존재하게 됩니다.
해당 부가 기능은 Aspect 내부의 Advice입니다.
그리고 해당 부가 기능의 실행 시점이 Pointcut입니다.
Aspect = Advice + Pointcut 입니다!

AOP 적용 방식

이런 AOP가 적용되는 시점은 3가지가 존재합니다.

컴파일 시점

  • 컴파일 시점에 공통 기능을 원하는 지점에 삽입함
  • .java 파일이 .class 파일로 컴파일 되는 시점에 부가 기능이 추가되는 방식
  • AspectJ가 제공하는 특정 컴파일러를 사용해야함

클래스 로딩 시점

  • 클래스가 로딩되는 시점에 바이트 코드 수준에서 공통 기능을 삽입함
  • .class 파일이 클래스 로더에 보관되기 전에 부가 기능이 추가되는 방식
  • 별도의 옵션과 클래스 로더 조작기를 지정해야함.

런타임 시점

스프링에서 채택한 방법

  • 런타임 도중 프록시 객체를 생성해서 공통 기능을 삽입함.
  • 프록시는 메소드 오버라이딩 개념으로 동작하기 때문에 Bean에만 적용시킬 수 있음
  • 별도의 컴파일러나 클래스 로더 조작기 등이 필요하지 않음

참고

profile
어제보다 더 나은 개발자가 되고파요
post-custom-banner

1개의 댓글

comment-user-thumbnail
2023년 8월 16일

공감하며 읽었습니다. 좋은 글 감사드립니다.

답글 달기