Spring AOP

박수민·2024년 3월 29일
0

| 스프링 AOP ( Aspect Oriented Programming )

AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다. 관점 지향은 쉽게 말해 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화하겠다는 것이다.

  • 참고 사항
    AOP(관점 지향 프로그래밍)는 프로그램 구조에 대한 또 다른 사고 방식을 제공하여 객체 지향 프로그래밍(OOP)을 보완한다. OOP의 모듈화 핵심 단위는 클래스인 반면, AOP의 모듈화 단위는 측면이다.

AOP에서 각 관점을 기준으로 로직을 모듈화한다는 것은 코드들을 부분적으로 나누어서 모듈화하겠다는 의미다. 이때, 소스 코드상에서 다른 부분에 계속 반복해서 쓰는 코드들을 발견할 수 있는 데 이것을 흩어진 관심사 (Crosscutting Concerns)라 부른다.

위와 같이 흩어진 관심사를 Aspect로 모듈화하고 핵심적인 비즈니스 로직에서 분리하여 재사용하겠다는 것이 AOP이다.

핵심 기능과 부가 기능

  • 핵심 기능이란, 해당 객체가 제공하는 주요 기능이다.
  • 부가 기능은 로그 추적기와 같이 핵심 기능을 보조하기 위해 사용되는 기능을 의미한다.


하지만 주로 하나의 부가 기능이 여러 곳에서 동일하게 사용이 되고는 하는데, 이를 횡단 관심사(cross-cutting concerns)라고 한다. 여러 기능들 사이에 걸쳐서 들어가는 관심사라는 뜻이다.

부가 기능 적용의 문제점

  1. 부가 기능을 적용할 때 아주 많은 반복이 필요하다.
  2. 부가 기능이 여러 곳에 퍼져서 중복 코드를 만들어낸다.
  3. 부가 기능을 변경할 때 중복 때문에 많은 수정이 필요하게 된다.
  4. 부가 기능의 적용 대상을 변경할 때 많은 수정이 필요하다.

소프트웨어에서 변경 지점은 하나가 될 수 있도록 모듈화하는 것이 필요한데, 부가 기능과 같은 특정 로직을 애플리케이션 전반에 적용하는 것은 일반적인 OOP 방식으로는 위의 문제점을 해결하기 힘들다.

| 스프링 AOP 특징

프록시 패턴 기반의 AOP 구현체, 프록시 객체를 쓰는 이유는 접근 제어 및 부가기능을 추가하기 위해서이다.
스프링 빈에만 AOP를 적용 가능하다.
모든 AOP 기능을 제공하는 것이 아닌 스프링 IoC와 연동하여 엔터프라이즈 애플리케이션에서 가장 흔한 문제(중복코드, 프록시 클래스 작성의 번거로움, 객체들 간 관계 복잡도 증가 ...)에 대한 해결책을 지원하는 것이 목적이다.

| AOP 주요 용어

  • Aspect : 위에서 설명한 흩어진 관심사를 모듈화 한 것. 주로 부가기능을 모듈화함.
  • Target : Aspect를 적용하는 곳 (클래스, 메서드 .. )
  • Advice : 실질적으로 어떤 일을 해야할 지에 대한 것, 실질적인 부가기능을 담은 구현체
  • JointPoint : Advice가 적용될 위치, 끼어들 수 있는 지점. 메서드 진입 지점, 생성자 호출 시점, 필드에서 값을 꺼내올 때 등 다양한 시점에 적용가능
  • PointCut : JointPoint의 상세한 스펙을 정의한 것. 'A란 메서드의 진입 시점에 호출할 것'과 같이 더욱 구체적으로 Advice가 실행될 지점을 정할 수 있음

+ 스프링 AOP : @AOP

스프링 @AOP를 사용하기 위해서는 아래와 같은 의존성을 추가해야 한다. 

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

참조 : https://engkimbs.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81AOP

0개의 댓글