지난번에 필터와 인터셉터의 차이에 대해서 공부를 해봤습니다. 그러나 Spring 내부에서는 인터셉터외에도 AOP(관점 지향 프로그래밍)가 있습니다. 그렇다면 이 AOP는 무엇이고 어떻게 사용이 되는지 공부를 해봤습니다.
AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 합니다. 이 관점 지향은 쉽게 말하면 어떤 로직을 기준으로 핵심적인 관점과 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 모듈화를 하는 것을 이야기 합니다. 여기서 모듈화란 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것을 이야기 합니다.
웹 애플리케이션은 핵심 비즈니스 로직이 있고, 애플리케이션 전체를 관통하는 부가 기능 로직이 있습니다. 이를 횡단 관심사(cross-cutting concerns)라고 합니다.
이 횡단 관심사의 코드를 핵심 비즈니스 로직의 코드와 분리하여, 코드의 간결성을 높이고 변경에 유연함과 무한한 확장이 가능하도록 하는 것이 AOP의 목적입니다.
컴파일 시점 적용: AspectJ 컴파일러가 일 반 .java파일을 컴파일할 때 부가기능을 넣어서 .class 파일로 컴파일해주는 것을 의미합니다. 이 동작을 Aspect와 실제 코드를 연결하는 위빙이라고 부릅니다.
클래스 로딩 시점 적용: JVM내 클래스로더에 .class 파일을 올리는 시점에 바이트 코드를 조작해 부가기능 로직을 추가하는 방식입니다.
런타임 시점 적용: main 메서드의 실행 이후에 자바가 제공하는 범위내에 부가 기능을 적용하는 방식입니다. 이미 런타임 중이기 때문에 코드를 조작하기 어려워 스프링, 컨테이너, DI, Bean등의 여러 개념과 기능을 이용해 프록시를 통해 부가 기능을 적용합니다.
프록시는 메서드 실행 시점에만 다음 타겟을 호출할 수 있기 때문에, 런타임 시점에 부가기능을 적용하는 방식은 메서드의 실행 지점으로 제한이 됩니다.
런타임 시점에 적용하는 방식을 사용합니다. 그 이유는 컴파일 시점과 클래스 로딩 시점에 적용을 하기 위해서는 별도의 컴파일러와 클래스로더 조작기를 써야하는데, 이것을 정하고 사용 및 유지하는 과정이 매우 어렵고 복잡하기 때문입니다.