• AOP(Aspect-Oriented-Programming)란
    공통 관심 사항(부가적 로직)을 구현한 코드를 핵심 로직을 구현한 코드 안에 삽입하는 것입니다.

  • 핵심 기능
    • 업무 로직을 포함하는 기능(게시글 작성, 댓글 작성, 예약하기 등 Core Concerns)
  •  부가 기능
    • 핵심 기능을 도와주는 부가적인 기능(로깅,보안,트랜젝션 등 Cross-cutting Concerns)

  • AOP용어
    • Advice
      JoinPoint에 삽입되어 동작할 수 있는 코드
      관점으로서 분리되고 실행 시 모듈에 Weaving 된 구체적인 처리
    • JoinPoint
      Advice를 주입(Weaving) 가능한 지점
      클래스 인스턴스 생성 시점, 메서드 호출 시점, 예외 시점 등 특정 작업 시점이
      시작되는 시점
    • PointCut
      JoinPoint의 부분 집합
      실제로 Advice가 적용되는 JoinPoint
    • Weaving
      Advice를 핵심 로직 코드에 적용하는 것
    • Aspect
      여러 객체의 공통으로 적용되는 공통 관심사항
      트랜잭션, 보안, 로그인 등등
    • Advisor
      Advice + PointCut

Run Time Weaving 구조도

  • 주입(Weaving)의 세 가지 방법
    • 컴파일 시에 주입(Weaving)하기
      AspectJ에서 사용하는 방법
      핵심 로직을 구현한 자바 소스 코드를 컴파일할 때, 알맞은 위치에 공통 코드를 삽입

    • 클래스 로딩 시에 주입(Weaving)하기
      원본 클래스 파일은 변경하지 않고 클래스 로딩할 때 JVM이 변경된 바이트 코드를 사용하도록 함.

    • 런타임 시에 주입(Weaving)하기
      Proxy를 이용한 AOP구현 방식
      중간에 프락시를 생성한 후 프록시를 통해 핵심 로직을 구현한 객체에 접근
      이때, 프락시의 핵심 로직을 실행하기 전 혹은 후에 공통 기능을 적용하는 방식
      • 프록시 기반의 한계
        메서드가 호출될 때만 Advice를 적용할 수 있기 때문에 필드 값 변경과 같은
        JoinPoint에 대해서는 적용 불가

  • 클래스 분리(OOP)와 차이점
    • OOP (비지니스 로직의 모듈화)
      모듈화의 핵심 단위는 비즈니스 로직
    • AOP (인프라 혹은 부가기능의 모듈화)
      각각의 모듈들의 주목적 외에 필요한 부가적 기능들
    • OOP에선 공통된 기능을 재사용하는 방법으로 상속이나 위임을 사용합니다.
      하지만 어플리케이션 여기저기에 사용되는 부가기능들을 상속이나 위임으로
      처리하기에는 깔끔하게 모듈화가 어렵습니다.
      즉 이러한 이유가 AOP의 등장 배경입니다.

  • 결론
    • AOP는 부가 로직을 핵심 로직과 분리함으로써 애플리케이션 전체에 흩어진 공통 기능이 하나의 장소에서 관리됩니다.
    • 다른 서비스 모듈들이 본인의 목적에만 충실하고 (객체지향 설계 원칙 중 SRP-단일 책임원칙)
      그 외 사항들은 신경 쓰지 않아도 되는 장점이 있습니다.

  • 참고

'spring' 카테고리의 다른 글

Filter, Intercepter, AOP 차이점  (0) 2020.09.23
MyBatis란?  (0) 2020.08.08
OCP 계방폐쇠 원칙 이해하기  (0) 2020.07.08

+ Recent posts