[Spring] 관점 지향 프로그래밍 - AOP

yjkim97·2023년 10월 6일
0

Spring & Spring boot

목록 보기
4/6
post-thumbnail

AOP란?

스프링의 중요한 계념으로는 AOP가 있다.
AOP란 Aspect Oriented Programming을 줄인 표현으로 직역하면 관점 지향 프로그래밍이
다.

1. AOP 목적 & 장점

1. OOP(객체지향 프로그래밍)을 보완하기 위해 쓰인다.

기존 객체지향은 목적에 따라 클래스를 만들고 객체를 만들었다. 이때 핵심 기능과 부가 기능 로직을 분리하지 못하는 단점이 존재했다.

2. 비즈니스 로직을 관점 기준으로 모듈화 한다.

프로그래밍에 대한 관심을 핵심 관점, 부가 관점으로 나누어서 관심 기준으로 모듈화 하는 것을 의
미한다.

3. 코드의 간결성, 유연성과 확장성을 높인다.

보통 비즈니스 웹 Application이라면 사업에 핵심적인 핵심 비즈니스 로직과 그외 부가 기능 로직이 존재한다.
이를 횡단 관심사(cross-cutting concerns)라고 한다.

횡단 관심사(부가 기능 로직) 코드를 핵심 비즈니스 로직과 분리하여, 코드의 간결성을 높이고 변경에 유연함과 무한한 확장이 가능하도록 하는것이 AOP의 목적이다.

2. AOP 적용 방식 3가지

1) 컴파일 시점 적용

AspectJ 컴파일러가 .java파일을 컴파일할 때 부가기능 로직을 넣어서 .class파일로 컴파일 해주는 방식이다.

컴파일 시점 적용 방식은 AspectJ가 제공하는 특수 컴파일러가 필요하다는 점과 복잡하다는 단점이 존재한다.

2) 클래스 로딩 시점 적용

JVM내 클래스로더에 .class파일을 올리는 시점에 바이트 코드를 조장해 부가기능 로직을 추가하는 방식이다.

모든 지점에 적용 가능하지만 특수 옵션과 클래스 로더 조작기를 지정해야하므로 운영하기 어렵다는 단점이 있다.

3) 런타임 시점 적용

컴퍼일이 끝나고 클래스 로더에 이미 다 올라가 자바가 실행된 다음에 동작하는 런타임 방식이다.
이는 실제 대상 코드는 그대로 유지되고 Proxy를 통해 부가 기능이 적용된다.

Proxy는 메서드 오버라이딩 개념으로 동작하기 때문에 메서드에만 적용 가능하다.
(이런 이유로 Bean에만 적용 가능하다.)

이 방식은 Spring이 사용하는 방식이다.

3. AOP 용어


용어설명
Joinpoint- 메소드를 호출하는 '시점', 예외가 발생하는 '시점'과 같이 애플리케이션을 실행할 때 특정 작업이 실행되는 '시점'을 의미한다.
Advice- Joinpoint에서 실행되어야 하는 코드
- 횡단관점에 해당함 (트랜잭션/로그/보안/인증등..)
Target- 실질적인 비지니스 로직을 구현하고 있는 코드
- 핵심관점에 해당함 (업무로직)
Pointcut- Target 클래스와 Advice가 결합(Weaving)될 때 둘 사이의 결합규칙을 정의하는 것이다
- 예로 Advice가 실행된 Target의 특정 메소드등을 지정
Aspect- Advice와 Pointcut을 합쳐서 하나의 Aspect라고 한다.
- 즉 일정한 패턴을 가지는 클래스에 Advice를 적용하도록 지원할 수 있는 것을 Aspect라고 한다.
Weaving- AOP에서 Joinpoint들을 Advice로 감싸는 과정을 Weaving이라고 한다.
- Weaving 하는 작업을 도와주는 것이 AOP 툴이 하는 역할이다

4. Spring의 AOP

Spring의 AOP는 런타임 시점 적용 방식을 사용한다.
이유로는 AspectJ 컴파일러, 복잡한 옵션 또는 클래스 로더 조작기를 사용하지 않아도 되기 때문이다.

  • 스프링은 Aspect의 적용 대상(Target)이 되는 객체에 대한 Proxy를 만들어 제공한다.
  • 대상 객제(Target)를 사용하는 코드는 Proxy를 통해서 간접적으로 접근한다.
  • Proxy는 Target의 실제 메서드가 호출되기 전 또는 후에 공통기능(Advice)를 실행한다.
  • 스프링 Bean에만 AOP를 적용 가능하다.
    모든 AOP 기능을 제공하는 것이 목적이 아닌 스프링 IoC와 연동하여 중복코드 제거, 복잡도 증가등에 대한 해결책을 지원하는 것이 목적이다.

Advisor 생성 과정

  1. 자동 프록시 생성기에 의해 @Aspect Bean을 Advisor로 변환해 저장한다. (Advisor 생성)
  2. 생성된 Advisor는 @Aspect Advisor 빌더 내부에 저장된다.

Proxy 적용 과정

  1. 스프링 Bean으로 등록된 객체를 생성한다.
  2. Bean을 등록하기 직전에 후처리기에 전달한다.
  3. 모든 Advisor Bean을 조회한다.
  4. @Aspect Advisor 빌더 내부에 저장된 모든 Advisor를 조회한다.
  5. 조회된 Advisor에 포함되어 있는 Pointcut을 통해 Proxy를 생성하고 Bean 저장소에 반환한다.
  6. Bean 저장소에 반환된 Proxy는 Bean으로 등록된다.

Reference

profile
어제는 🐸두꺼비 오늘은 😄YJ

0개의 댓글