[Spring] AOP - 기본편

yeonjoo913·2023년 7월 9일
0

Spring

목록 보기
9/19

AOP(관점 지향 프로그래밍)란?

비즈니스 로직과 관련 없지만 여러 모듈에 걸쳐 공통적이고 반복적으로 처리가 필요한 내용을 횡단 관심사(Cross-Cutting Concern)이라고 합니다. 이를 DRY(Do not Repeat Yourself)대로 분리해서 한 곳으로 모으는 방법을 관점 지향 프로그래밍(AOP)라고 합니다. 예시로 보안, 로깅, 트랜잭션 관리, 모니터링, 캐시처리, 예외처리가 있습니다.
즉, 간단히 말하면 DI는 모듈 간의 결합도를 낮춘다면, AOP는 핵심로직과 부가 가능을 분리하여 애플리케이션 전체에 걸쳐 사용되는 부가 기능을 모듈화하여 재사용할 수 있도록 지원하는 것이다.

AOP 주요 용어 및 개념

  • Aspect : AOP 단위가 되는 횡단 관심사(ex.로그출력,예외처리 등)
  • Target : AOP 처리에 의해 변화가 생기는 객체. Pointcut으로 결정
  • Join Point: 실행되는 코드. Aspect를 실제로 구현해서 처리하는 부분 (해야할 일)
  • Advice : AOP에서 실제 실행되는 코드
    • Advice 유형
      • Before : target메서드가 실행되기 전에 advice가 실행
      • After Returning : target메서드가 정상적으로 종료한 후에 실행
      • After Throwing : target메서드에서 예외가 발생했을 때 실행
      • After : target메서드가 실행된 후 실행. 예외 발생이나 정상 종료 여부에 관계 없이 무조건 실행
      • Around : target메서드를 감싸는 Advice. 가장 강력한 어드바이스이며, 메소드 실행 전후 처리는 물론 포인트컷이 적용된 대상 메서드 자체도 실행할 수 있다.
  • Join Point : Advice를 실제로 실행하고자 하는 위치
    • ex) 메서드 실행 시점, 생성자 호출 시점 등등
    • 스프링 AOP는 프록시 방식을 사용하므로 조인 포인트는 항상 메서드 실행 지점
  • Pointcut : 수많은Join Point 중에서 실제로 Advice 가 적용될 위치를 선별하는 기능
    • 스프링 AOP는 프록시 기반이기 때문에 조인 포인트가 메서드 실행 시점뿐이고 포인트 컷도 메서드 실행 시점만 가능
  • AOP Proxy : Spring에서 AOP는 Dynamic Proxy 기법으로 AOP를 구현하고 있다. 즉, 우리가 AOP가 적용된 Target메소드를 호출할때 바로 그 메소드가 호출되는 것이 아니라 Advice가 요청을 대신 랩핑(Wrraping) 클래스로써 받고 그 랩핑 클래스가 Target을 호출한다.
  • Introduction : AOP를 적용할때 내부적으로 코드를 생성하는 것을 말한다. (Spring의 경우 Wrraping class)
  • Weaving : Aspect가 Target에 적용되는 전체적인 과정을 말한다. 즉, Pointcut으로 지정된 JoinPoint에 Advice가 적용되어 Target을 호출 시 AOP Proxy가 만들어지는 과정이다.

AOP 적용 방법

  • 컴파일 시점
    • Java를 .class 파일로 컴파일하는 시점에 조작된 바이트 코드를 실행시킨다. 로드, 런타임은 따로 안들지만, 별도의 컴파일 과정이 필요한다.
    • 주로 Aspect에서 사용
  • 로드 타임
    • 클래스 파일을 로딩하는 시점에 weaving,load time weaving
    • 다양한 Aspect 사용 가능
  • 런타임
    • Spring AOP에서 사용하는 방식
    • Proxy 객체로 감싸는 것, 최초의 Bean 설정 시간이 증가한다.

Spring AOP : 프록시 기반 AOP

특징

  • Proxy 기반의 AOP 구현체
  • Spring Bean에서만 AOP를 적용할 수 있다.
  • 모든 AOP 기능을 제공하는 것이 목적이 아니라, 스프링 IoC와 연동해서 Enterprise Application에서 가장 흔한 문제에 대한 해결책을 제공하는 것이 목적이다. (중복 코드, 객체 관계 복잡도 증가…)
profile
주니어 백엔드 개발자. 까먹는다 기록하자!

0개의 댓글