[Spring boot] Spring AOP

예림·2024년 6월 5일
5

Spring boot

목록 보기
6/8
post-thumbnail

AOP(Aspect-Oriented Programming)

: 관점(Aspect) 지향 프로그래밍

메소드나 객체의 기능을 핵심 관심사(Core Concern)와 공통 관심사(Cross-cutting Concern)로 나누어 프로그래밍하는 것

**“핵심 관심사”** : 각 객체가 가져야 할 본래의 기능
**“공통 관심사”** : 여러 객체에서 공통적으로 사용되는 코드

공통 관심사Aspect로 정의하고 Aspect로 적용할 메소드나 클래스Advice를 적용하여 공통 관심사와 핵심 관심사를 분리한다.

OOP(객체 지향 프로그래밍)를 보완한 것으로, 공통 기능을 개발자의 코드 밖에서 필요한 시점에 적용하는 프로그래밍 방법이다.

💡 여기서 3개의 A, B, C의 클래스가 있다고 가정합니다.

클래스 A에서는 주황, 파랑, 빨간색 블록으로 구성이 되어 있고 클래스 B에서는 빨강, 주황 블록으로 구성되어 있으며 클래스 C에서는 주황, 파랑 블록으로 구성되어 있습니다.

해당 색은 클래스 A, B, C에서 동일하게 사용되는 코드를 의미합니다.

예를 들어서 클래스 A에서 주황색 블록을 수정을 하게 되면 클래스 B, C에서도 수정을 해야 합니다. 이렇게 되면 유지보수 차원에서 모든 코드를 수정해야 하니 불편한 점이 있습니다. 그래서 Aspect X에서는 공통 관심사인 주황색 블록을 묶어서 모듈화를 시켜서 코드의 재 사용성과 유지 보수성을 강화하였습니다.

이렇듯, 관점 지향 프로그래밍에서는 소스코드에서 반복적으로 사용하는 코드를 하나로 묶어서 모듈화하여 재사용성과 유지 보수성을 높일 수 있는 강점을 가지고 있습니다.

주요 용어


용어설명
Aspect- 공통적인 기능들을 모듈화 한 것
Target- Aspect가 적용될 대상/ 메소드, 클래스 등
Join point- Aspect가 적용될 수 있는 시점/ 메소드 실행 전, 후 등
Advice- Aspect의 기능을 정의한 것/ 메서드의 실행 전, 후, 예외 처리 발생 시 실행되는 코드
Point cut- Join point를 정의하는 표현식, Advice가 적용될 위치 결정
Weaving- Point cut에 명시된 Join point에 Advice를 적용하는 과정

주요 어노테이션


메서드설명
@Aspect해당 클래스를 Aspect로 사용하겠다는 것을 명시
@Before대상 “메서드”가 실행되기 전에 Advice를 실행
@AfterReturning대상 “메서드”가 정상적으로 실행되고 반환된 후에 Advice를 실행
@AfterThrowing대상 “메서드에서 예외가 발생”했을 때 Advice를 실행
@After대상 “메서드”가 실행된 후에 Advice를 실행
@Around대상 “메서드” 실행 전, 후 또는 예외 발생 시에 Advice를 실행

Point cut 정의하기


포인트컷을 이용하면 어드바이스 메소드가 적용될 비즈니스 메소드를 정확히 필터링할 수 있다.

포인트컷 표현식은 ‘execution’과 같은 포인트컷 지시자로 시작한다. 줄여서 PCD라고 한다.

지시자(PCD, AspectJ pointcut designators)의 종류

  • execution : 메소드 실행 조인 포인트를 매칭한다. 스프링 AOP에서 가장 많이 사용하고, 기능도 복잡하다
  • within : 특정 타입 내의 조인 포인트를 매칭한다
  • args : 인자가 주어진 타입의 인스턴스인 조인 포인트
  • this : 스프링 빈 객체 ( 스프링 AOP 프록시 )를 대상으로 하는 조인 포인트
  • target : Target 객체 ( 스프링 AOP 프록시가 가르키는 실제 대상 )를 대상으로 하는 조인 포인트
  • @target : 실행 객체의 클래스에 주어진 타입의 애노테이션이 있는 조인 포인트
  • @within : 주어진 애노테이션이 있는 타입 내 조인 포인트
  • @annotation : 메서드가 주어진 애노테이션을 가지고 있는 조인 포인트를 매칭
  • @args : 전달된 실제 인수의 런타임 타입이 주어진 타입의 애노테이션을 갖는 조인 포인트
  • bean : 스프링 전용 포인트컷 지시자, 빈의 이름으로 포인트컷을 지정한다

작성중..

AOP proxy


스프링 AOP의 동작방식을 이해하기 위해 반드시 알아둬야할 중요한 요소이다.

  • 프록시 객체
    프록시 객체는 객체 지향 프로그래밍에서 자주 사용되는 디자인 패턴 중 하나이다. 즉, 스프링에서만 사용되는 것이 아니라 이전부터 존재하던 개념이라고 볼 수 있다.
    프록시 객체는 실제 객체의 대리인 역할을 수행하며, 실제 객체와 동일한 인터페이스를 구현한다. 따라서, 클라이언트에서 실제 객체를 호출하는 것처럼 보일지라도 실제로는 진짜 객체의 메소드를 프록시 객체가 대신 호출한다.
    프록세 객체는 실제 객체의 대리인 역할을 수행하며, 실제 객체와 동일한 인터페이스를 구현한다. 따라서, 클라이언트에서 실제 객체를 호출하는 것처럼 보일지라도 실제로는 진짜 객체의 메소드를 프록시 객체가 대신 호출한다.

실제 객체와 같은 인터페이스를 구현하였더라도 실제 객체의 메소드를 호출할 때 추가적인 동작을 수행하도록 구현되는데, 이를 통해 타깃이 되는 실제 객체의 동작을 제어하거나 변경할 수 있다.

  • Spring AOP는 기본적으로 실제 객체 대신 프록시 객체가 사용되며 이 때 AOP 프록시는 기본적으로 표준 JDK 동적 프록시를 사용한다.

스프링 프레임워크에서의 AOP 적용 사례


스프링 AOP를 사용하는 대표적인 적용 사례로는 선언적 트랜잭션 관리, 로깅, 보안 검사 등이 있다.

  • 선언적 트랜잭션 관리는 스프링 AOP를 사용하여 메서드 실행을 감싸 트랜잭션이 자동으로 시작되고 종료되도록 할 수 있기 때문이다. 이를 통해 개발자는 비즈니스 로직에만 집중할 수 있으며, 트랜잭션 관리 코드를 중복으로 작성할 필요가 없어진다.
  • 또한, 로깅 Aspect를 통해 메서드의 실행 전후에 자동으로 로그를 기록할 수 있다. 이는 시스템의 상태를 모니터링하고 디버깅을 용이하게 하며, 필요한 정보를 기록하는 데 효과적이다.
  • 보안 검사는 메서드 실행 전에 사용자의 인증 상태를 확인하는 Aspect를 적용함으로써, 권한이 없는 사용자의 접근을 사전에 차단할 수 있다. 이는 애플리케이션의 보안성을 향상시키는 데 중요한 역할을 한다.

이 외에도, 스프링 AOP는 애플리케이션의 성능을 모니터링하거나, 예외 처리 로직을 공통화하는 등 다양한 방법으로 활용될 수 있다.

AOP를 통해 개발자는 공통 기능을 한 곳에 모듈화하여 관리할 수 있으며, 이는 비즈니스 로직과 공통 기능의 결합도를 낮추어 코드의 가독성과 재사용성을 높일 수 있다.


참고자료
https://velog.io/@kai6666/Spring-Spring-AOP-개념
https://engkimbs.tistory.com/entry/스프링AOP
https://adjh54.tistory.com/133
https://f-lab.kr/insight/understanding-and-applying-aop-in-programming
https://sjh836.tistory.com/157
https://hyeonmin.tistory.com/109

profile
백엔드 개발하는 사람

0개의 댓글