Posts AOP
Post
Cancel

AOP

AOP = Aspect Oriented Programming = 관점 지향 프로그래밍

관점 지향이란 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 모듈화 하겠다는 것이다. 여기서 모듈화란 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것을 말한다.

AOP에서 각 관점을 기준으로 모듈화한다는 것은 코드들을 부분적으로 나누어서 모듈화하겠다는 의미다. 개발을 하다보면 서로 다른 파일에서 같은 코드를 반복해서 쓰는 경우가 있는데 이것을 흩어진 관심사(crosscutting concerns)라고 한다. 이처럼 흩어진 관심사를 Aspect로 모듈화하고 핵심적인 비즈니스 로직에서 분리하여 재사용하겠다는 것이 AOP의 취지이다.

crosscutting concerns


AOP의 주요 개념

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


다양한 AOP 적용 방법

  • 컴파일
  • 바이트 코드 조작
    • 타겟을 뜯어 고쳐서 부가기능을 직접 넣어주는 직접적인 방법을 뜻한다.
    • 컴파일된 Target 클래스 파일 자체를 수정하거나 클래스가 JVM에 로딩되는 시점을 가로채 바이트코드를 조작하는 방법을 사용한다.
    • 사용 이유
      1. 스프링과 같은 DI 컨테이너의 도움을 받지 않아도 AOP 적용이 가능하다. 따라서 스프링과 같은 컨테이너가 사용되지 않는 환경에서도 쉽게 AOP 적용이 가능해진다.
      2. 프록시 패턴보다 강력하고 유연한 AOP가 가능하다
        • 프록시 패턴에서는 부가기능(공통 모듈)을 부여할 대상은 클라이언트가 호출할 때 사용하는 메소드로 제한된다.
        • 하지만 바이트 코드 조작방식은 오브젝트 생성, 필드 값 조회 및 조작, static 초기화 등 다양한 작업에 부가 기능을 명시할 수 있다.
  • 프록시 패턴(스프링 AOP에서 사용하는 방법)
    • 공통 모듈을 프록시로 만들어서 DI로 연결된 빈 사이에 적용해 Target 메소드 호출 과정에 참여하여 부가기능(공통 모듈)을 제공해줌
    • 독립적으로 개발한 부가기능 모듈을 다양한 타깃 오브젝트의 메소드에 다이내믹하게 적용해주기 위해 가장 중요한 역할을 맡고 있는 게 프록시이다.


스프링 AOP 특징

  • 프록시 패턴 기반의 AOP 구현체, 프록시 객체를 사용. 접근 제어 및 부가기능을 추가하기 위함
  • 스프링 빈에만 AOP 적용가능
  • 모든 AOP 기능을 제공하는 것이 아닌 스프링 IoC와 연동하여 애플리케이션에서 겪는 흔한 문제에 대한 해결책을 지원하는 것이 목적

spring aop


참고문서

참고문서2

This post is licensed under CC BY 4.0 by the author.

ModelAttribute와 NoArgsConstructor 추가 시 아무것도 안들어가는 이슈

API 예외처리

Comments powered by Disqus.