AOP

Jeong Gyejin·2023년 3월 10일
0

스프링 프레임워크

목록 보기
7/17

지난번에 필터와 인터셉터의 차이에 대해서 공부를 해봤습니다. 그러나 Spring 내부에서는 인터셉터외에도 AOP(관점 지향 프로그래밍)가 있습니다. 그렇다면 이 AOP는 무엇이고 어떻게 사용이 되는지 공부를 해봤습니다.

AOP

AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 합니다. 이 관점 지향은 쉽게 말하면 어떤 로직을 기준으로 핵심적인 관점과 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 모듈화를 하는 것을 이야기 합니다. 여기서 모듈화란 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것을 이야기 합니다.

웹 애플리케이션은 핵심 비즈니스 로직이 있고, 애플리케이션 전체를 관통하는 부가 기능 로직이 있습니다. 이를 횡단 관심사(cross-cutting concerns)라고 합니다.
이 횡단 관심사의 코드를 핵심 비즈니스 로직의 코드와 분리하여, 코드의 간결성을 높이고 변경에 유연함과 무한한 확장이 가능하도록 하는 것이 AOP의 목적입니다.

AOP 주요 개념

  • Aspect: 흩어진 공통의 기능들을 모듈화 한 것으로 주로 부가기능들을 모듈화합니다.
  • Target: Aspect를 적용하는 곳으로 핵심 기능들을 담은 모듈입니다.
  • Advice: 실질적으로 어떤 일을 해야할 지에 대한 것으로 부가기능을 담은 구현체들입니다.
  • JointPoint: Advice가 적용될 위치, 끼어들 수 있는 지점과 메서드 진입 지점, 생성자 호출 시점 등의 다양한 시점에 적용이 가능합니다.
  • PointCut: JointPoint의 상세한 스펙들을 정의한 것으로 Advicerk 실행될 지점을 구체적으로 지정할 수 있습니다.

AOP 적용 방식

  • 컴파일 시점 적용: AspectJ 컴파일러가 일 반 .java파일을 컴파일할 때 부가기능을 넣어서 .class 파일로 컴파일해주는 것을 의미합니다. 이 동작을 Aspect와 실제 코드를 연결하는 위빙이라고 부릅니다.

  • 클래스 로딩 시점 적용: JVM내 클래스로더에 .class 파일을 올리는 시점에 바이트 코드를 조작해 부가기능 로직을 추가하는 방식입니다.

  • 런타임 시점 적용: main 메서드의 실행 이후에 자바가 제공하는 범위내에 부가 기능을 적용하는 방식입니다. 이미 런타임 중이기 때문에 코드를 조작하기 어려워 스프링, 컨테이너, DI, Bean등의 여러 개념과 기능을 이용해 프록시를 통해 부가 기능을 적용합니다.
    프록시는 메서드 실행 시점에만 다음 타겟을 호출할 수 있기 때문에, 런타임 시점에 부가기능을 적용하는 방식은 메서드의 실행 지점으로 제한이 됩니다.

Spring AOP

런타임 시점에 적용하는 방식을 사용합니다. 그 이유는 컴파일 시점과 클래스 로딩 시점에 적용을 하기 위해서는 별도의 컴파일러와 클래스로더 조작기를 써야하는데, 이것을 정하고 사용 및 유지하는 과정이 매우 어렵고 복잡하기 때문입니다.

profile
항상 더 나은 개발자가 되기 위해서 끊임없이 공부하고 학습하면서 성장하는 사람이 되겠습니다.

0개의 댓글