AOP란 ?

AOP는 Aspect Oriented Programming의 약자로, 관점 지향 프로그래밍이라고 부른다. 그리고 흩어진 Aspect를 모듈화 할 수 있는 프로그래밍 기법이다.

위와 같은 그림에서, 주황색, 파란색, 빨간색은 각각의 클래스에서 비슷하게 진행되는 메소드, 필드, 코드등을 나타낸다. 이렇게 각각의 클래스에서 반복되는 코드를 흩어진 관심사(Crosscutting Concerns)라고 한다. 만약 Class A의 주황색 부분에 기능 변경이 일어나 수정을 해야 한다면, Class B와 Class C 모두 수정을 해야 할 것이다. 일이 두 세배 더 늘어나는 것이다. 이런 문제를 해결하기 위해 AOP는 모듈화를 진행한다. 흩어져 있는 부분을 Aspect를 이용해 모듈화 작업을 진행한다. 그리고 개발자가 이 기능을 어디어디에 적용해야 할지 알려주는 작업을 함으로써 중복된 코드를 방지하고, 비즈니스 로직에만 집중할 수 있도록 한다. 즉 정리하자면, 해야 할 일과 이 일을 어디에 적용해야 하는지를 묶어서 모듈화라고 하며, AOP라고 한다.

AOP와 주요 개념

  • Advice : 언제 공통 관심 기능을 핵심 로직에 적용할지를 정의(Around, Before, After Returning, After throwing 등)
  • JoinPoint : Advice를 적용 가능한 지점. 클래스의 인스턴스 생성 시점, 메소드 호출 시점, 예외 발생 시점과 같이 애플리케이션을 실행할 때 특정 작업이 시작되는 시점을 조인포인트라고 한다.
  • Pointcut : 조인포인트의 부분집합으로 실제로 Advice가 적용되는 Joinpoint를 말한다.
  • Weaving : 어드바이스를 핵심 로직 코드에 적용하는 것
  • Aspect : Aspect 안에 모듈화 한 것을 말한다. Pointcut + Advice의 결합을 말한다.
  • Target : 핵심 로직을 구현하는 클래스

AOP 구현체

  • AspectJ : 다양한 조인포인트와 기능을 제공
  • Spring AOP : 국한적으로 기능을 제공

AOP 적용 방법

  • 컴파일 : 자바파일을 클래스파일로 만들 때, 바이트 코드를 조작하여 AOP가 적용된 바이트코드를 생성
    • 별도의 컴파일링 과정을 거쳐야 함
  • 로드 타임 : 컴파일은 순수하게 적용이 되었지만, 클래스를 로딩하는 시점에 로딩하는 클래스 정보를 조작하여 AOP를 적용(로드타임 위빙)
    • 로딩 시점에 약간의 부하가 생길 수 있음
    • 로드타임 위버를 설정해주어야 함
  • 런타임 : A라는 클래스를 빈으로 만들 때, A라는 타입을 감싼 프록시 빈을 만들어, 프록시 빈이 클래스 전 후 작업을 추가하여 실행할 수 있도록 함(스프링 AOP가 사용하는 방법)
    • 빈을 초기 만드는 시점에만 부가적인 비용이 발생함
    • 웹에서 요청이 들어올 때에는 성능을 잡아먹지 않음

참고 자료

  1. 스프링 프레임워크 핵심 기술

oksusutea's blog

꾸준히 기록하려고 만든 블로그