스프링 AOP개념과 용어들

justindevcode·2024년 3월 15일
0

스프링 AOP

목록 보기
9/22
post-thumbnail
post-custom-banner

스프링 AOP개념과 용어들

애플리케이션 로직은 크게 핵심 기능과 부가 기능으로 나눌 수 있다.
기본적으로 service를 만든다면 주문로직이 핵심기능이고, 이기능의 시간을 측정하거나 로그를 띄운다면 이것이 부가 기능이 될 수 있다.

로직을 보통 controller, service ... 이런식으로 나눠 만들게 된다고 할때 여러 클레스에 똑같은 시간 측정이나, 로그를 띄우는 기능이 필요하다면
하나의 부가기능이 횡단 관심사를 가지게 된다고 할 수 있다.

문제는 이런 횡단 관심사의 경우 기존의 OOP의 방식으로는 한계가 있다. 클래스로 나누거나 해도 결국 핵심기능 코드에 같이 넣어줘야하는 코드 생기고, try catch같은 로직이 들어간다면 복잡해진다.

이를 해결하기위해 AOP가 나왔다.

AOP

위와 같은 문제를 해결하기위해 부가기능과 이를 어디에 적용할지를 선택하는 기능을 합해서 하나의 모듈로 만든것이 aspect이다.
이전에 배운@Aspect가 그것이다. 스프링의 저드바이저도 하나의 애스펙트라고 할 수 있다.

이런 부가기능을 모아서 애플리케이션을 controller, service ...이런식으로 작동하는 관점을 멀리서 보며 부가기능을 적용하는것을
애스펙트를 사용한 관점 지향 프로그래밍 AOP라고 한다.

AOP의 가장큰 프레임 워크는 AspectJ프레임 워크이다.
그리고 스프링자체 AOP도 있는데 AspectJ의 문법만 차용해서 AspectJ의 일부기능만 제공한다. 다만 스프링AOP로도 99% 실무문제 해결은 가능하며 AspectJ는 너무 복잡하기에 스프링AOP를 학습권장한다.

AOP 작동방식

크게 3가지가 있다.

  • 컴파일시점
  • 클래스 로딩시점
  • 런타임 시점(프록시)

컴파일 시점은 .java파일을 컴파일러를 사용해서 .class로 만드는 시점에 물리적으로 원하는 코드를 복붙해버리는 느낌이다.
클래스 로딩시점도 위와 비슷하게 .class가 된파일을 JVM에 올리는 시점에서 조작하는 기능을 통해 코드를 복붙해버린다.

다만 위와같은 두 방법은 특별한 컴파일러를 사용해야하거나, 모니터링툴 세팅등을 해야해서 상당히 복잡하다.

런타임 시점에서는 우리가 이전에 배운 방식으로 프록시를 이용해서 사용한다.
다만 DI, 빈포스트 프로세서, 스프링컨테이너 등 모든 기술을 총동원해야하며
프록시 특정상 메소드를 호출하며 위아래 사이로 진행되기때문에 AOP를 메소드에만 적용할 수 있다. (빈으로 등록가능한)

컴파일과 클래스로딩시점에서는 생성자나, static 이런곳에서도 코드를 갔다 박아버리면 AOP를 적용할 수 있지만 프록시는 이게 안된다.

다만 대부분의 99% 실무는 메소드AOP로 해결이 되기때문에 컴파일, 클래스 로딩시점의 AOP를 지원하는 AspectJ를 사용할 필요가 없다는거다.

용어정리

조인포인트 : 부가기능이 적용가능한 모든 위치 (프록시AOP를 사용한다면 메소드만 가능하기에 모든 메소드가 조인포인트)
포인트컷 : 조인포인트 중에서 적용할 지점
타켓 : 핵심기능의 객체, 포인트컷을 포함하는 객체
어드바이스 : 부가기능
애스펙트 : 어드바이스 + 포인트컷을 모듈화한것 (@Aspect)
어드바이저 : 딱하나의 어드바이스, 딱하나의 포인트컷으로 구성된것 (스프링AOP)에서만 사용되는 용어
위빙 : 포인트컷으로 결정한 타켓의 조인 포인트에 어드바이스를 적용하는 것
AOP프록시 : AOP 기능을 구현하기 위해 만든 프록시 객체, 스프링에서 AOP 프록시는 JDK 동적 프록시 또는 CGLIB 프록시이다.


profile
("Hello World!");
post-custom-banner

0개의 댓글