
Valiation BindingResult를 알아보다가 스프링 AOP에 대해 새로 알게 되어 기록해보려 한다.
AOP는 Aspect Oriented Programming의 약자로, 관점지향프로그래밍이라 불린다. 관점지향은 쉽게 말해 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고, 그 관점을 기준으로 각각 모듈화하겠다는 뜻이다.
모듈화란
어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것을 의미한다.
Spring의 핵심 개념 중 하나인 DI가 애플리케이션 모듈들 간의 결합도를 낮춘다면, AOP(Aspect-Oriented Programming)는 핵심 로직과 부가 기능을 분리하여 애플리케이션 전체에 걸쳐 사용되는 부가 기능을 모듈화하여 재사용할 수 있도록 지원한다.
Aspect-Oriented Programming이란 단어를 번역하면 관점(관심) 지향 프로그래밍이 된다. 또한, 프로젝트 구조를 바라보는 관점을 바꿔보자는 의미이다.

각각의 Service의 핵심기능에서 바라보았을 때, User과 Order는 공통된 요소가 없다. 하지만 부가기능 관점에서 바라본다면 다른 이야기이다.

부가기능 관점에서 바라보면 각각의 Service의 getXX 메서드를 호출하는 전후에 before과 after라는 메서드가 공통되는 것을 확인할 수 있다.
기존에 OOP에서 바라보던 관점을 다르게 하여 부가기능적인 측면에서 보았을 때, 공통된 요소를 추출하자는 것을 의미한다. 이 때 가로(횡단) 영역의 공통된 부분을 잘라냈다고 하여, AOP를 크로스 컷팅(Cross-Cutting) 이라고 부르기도 한다.
각각의 모듈들의 주 목적 외에 필요한 부가적인 기능들
간단하게 한줄로 AOP를 정리해보자면,
AOP는 공통된 기능을 재사용하는 기법이다.
OOP에선 공통된 기능을 재사용하는 방법으로 상속이나 위임을 사용한다.
하지만 전체 애플리케이션에서 여기저기 사용되는 부가기능들은 상속이나 위임으로 처리하기에는 깔끔한 모듈화가 어렵다.
그래서 등장한 것이 AOP이다.
💡 AOP의 장점
- 애플리케이션 전체에 흩어진 공통 기능이 하나의 장소에서 관리되어 유지보수가 좋다.
- 핵심 로직과 부가 기능의 명확한 분리로, 핵심 로직은 자신의 목적 외에 사항들에는 신경쓰지 않는다.
AOP의 적용 방식은 크게 아래와 같이 3가지 방법이 있다.
.java 파일을 컴파일러를 통해 .class를 만드는 시점에 부가 기능 로직을 추가하는 방식
모든 지점에 적용 가능
AspectJ가 제공하는 특별한 컴파일러를 사용해야 하기 때문에 특별할 컴파일러가 필요한 점과 복잡하다는 단점
.class 파일을 JVM 내부의 클래스 로더에 보관하기 전에 조작하여 부가 기능 로직 추가하는 방식
모든 지점에 적용 가능
특별한 옵션과 클래스 로더 조작기를 지정해야하므로 운영하기 어려움
스프링이 사용하는 방식
컴파일이 끝나고 클래스 로더에 이미 다 올라가 자바가 실행된 다음에 동작하는 런타임 방식
실제 대상 코드는 그대로 유지되고 프록시를 통해 부가 기능이 적용
프록시는 메서드 오버라이딩 개념으로 동작하기 때문에 메서드에만 적용 가능 -> 스프링 빈에만 AOP를 적용 가능
특별한 컴파일러나, 복잡한 옵션, 클래스 로더 조작기를 사용하지 않아도 스프링만 있으면 AOP를 적용할 수 있기 때문에 스프링 AOP는 런타임 방식을 사용