감자튀김 공장🍟

[Spring] Aspect Oriented Programming (AOP)이란? 본문

JAVA/Spring

[Spring] Aspect Oriented Programming (AOP)이란?

Potato potage 2022. 4. 18. 12:54
반응형

1. Aspect Oriented Programming (AOP) 이란?

AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 한다. 이는 횡단 관심사(Cross-cutting concern)의 분리를 허용함으로써 모듈성을 증가시키는 것이 목적인 프로그래밍 패러다임이다. 코드 그 자체를 수정하지 않는 대신 기존의 코드에 추가 동작을 추가함으로써 수행한다.

즉, 어떤 기능을 구현할 때 주요 핵심 기능과 핵심 기능 구현을 위한 부가적인 기능 구현을 분리하여 각각의 관점별로 묶어서 개발하는 방식이다.

 

왼쪽 그림에서 보면 Module 1,2,3에 여러가지 concern들이 겹쳐 있음을 알 수 있다. 즉, concern들이 각각의 모듈에 특정 부분을 이루고 있다고 이해하면 된다. 이렇게 비즈니스 로직과 로깅 기능이 혼합되면 코드의 복잡성과 상호 의존성이 증가하며 코드의 반복이 포함된다.

하지만 모듈마다 중복되는 코드들을 모듈과 따로 분리하여 aspect로 모듈화 한 것이 오른쪽 그림이다.

이렇게 모듈, 클래스마다 중복되는 코드들을 Aspect로 모듈화하고 비즈니스 로직에서 분리하여 재사용한다는 것이 AOP의 취지이다.

 

2. AOP 용어

  • Aspect
    • 흩어진 관심사(Cross-cutting concerns)를 묶어서 모듈화 한 것이다.
    • pointcut과 advice의 조합이다.
  • Advice
    • Target에 종속되지 않고 순수하게 부가 기능만 실제로 구현된 부분이다.
    • 어떤 일을 해야하는 지에 대한 정보를 가지고 있다.
    • Advice 타입
      • before
      • after
      • after-retuning
      • after-throwing
      • around
  • Target
    • 모듈화된 Aspect을 수행해줘야 하는 주요 비지니스 클래스, 메서드 등을 의미한다.
  • Join point
    • Advice가 적용될 위치, 끼어들 수 있는 지점이다.
    • ex) 생성자 호출 직전, 생성자 호출 시, 필드에 접근하기 전..
  • PointCut
    • 부가기능을 수행할 지점(Advice)에 대한 스펙 정의서
  • Advisor: PointCut + Advice (스프링 AOP에서 사용)

 

3. AOP 적용 방법

  • 컴파일 타임에 적용
    • 컴파일 시점(.java 파일을 .class 파일로 만들 때)에 바이트 코드를 조작하여 AOP가 적용된 바이트 코드를 생성
  • 로드 타임에 적용
    • 컴파일한 뒤 클래스를 로딩하는 시점에 클래스 정보를 변경
  • 런타임에 적용
    • 스프링 AOP가 선택하는 방법이며 A 클래스 타입의 Bean을 만들 때 A 타입의 Proxy Bean을 만들어 Proxy Bean이 Aspect 코드를 추가하여 동작

 

4. 구현 방식

  • XML 기반의 POJO 클래스를 이용한 AOP 구현
    • 순서
      • aspect를 구현
      • aspect를 설정 (xml 설정 파일에 <aop: config> 추가)
      • pointcut를 설정
      • advices를 설정
  • @Aspect Annotation을 이용한 AOP 구현
    • 순서
      • xml 설정 파일에 <aop:aspectj-autoproxy /> 설정
      • aspect 설정 (aspect class에 @Aspect annotation 사용)
      • pointcut 설정
      • advices 설정

 

5. AOP 특징

  • 프록시 패턴 기반
    • spring은 target 객체에 대한 프록시를 만들어서 제공
    • 타겟을 감싸는 프록시는 runtime에 생성
    • 프록시는 어드바이스를 target 객체에 적용하면서 생성되는 객체
    • 프록시 객체를 쓰는 이유는 접근 제어 및 부가기능을 추가하기 위함
  • 프록시가 호출을 가로챔(Intercept)
    • 프록시는 타겟 객체에 대한 호출을 가로챈 다음 advice의 부가 기능 로직을 수행하고 난 후에 target의 핵심 기능 로직을 호출한다(전처리 어드바이스)
    • target의 핵심 기능 로직 메서드를 호출한 후에 부가 기능(advice)을 수행하는 경우도 있다.(후처리 어드바이스)
  • 메서드 join point만 지원
    • spring은 동적 프록시를 기반으로 AOP를 구현하므로 메서드 조인 포인트만 지원
    • 핵심 기능(target)의 메서드가 호출되는 런타임 시점에만 부가기능(advice)을 적용할 수 있음
    • 반면에 AspectJ 같은 고급 AOP 프레임워크를 사용하면 객체의 생성, 필드 값의 조회와 조작, static 메서드 호출 및 초기화 등의 다양한 작업에 부가 기능을 적용할 수 있음

 

 

출처

https://ko.wikipedia.org/wiki/%EA%B4%80%EC%A0%90_%EC%A7%80%ED%96%A5_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D

https://velog.io/@dusdn2424/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8A%A4%ED%94%84%EB%A7%81-AOP-%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC

https://yadon079.github.io/2021/spring/spring-aop-core

https://ss-o.tistory.com/137

반응형

'JAVA > Spring' 카테고리의 다른 글

[Spring] java.lang.UnsupportedClassVersionError  (0) 2022.07.01
[Spring] MVC 패턴 알아보기  (0) 2022.04.19
[Spring] Dependency Injection(DI)란?  (0) 2022.04.17
[Spring] Spring 개요  (0) 2022.04.15
Comments