컴퓨팅에서 관점 지향 프로그래밍(aspect-oriented programming, AOP)은 횡단 관심사(cross-cutting concern)의 분리를 허용함으로써 모듈성을 증가시키는 것이 목적인 프로그래밍 패러다임이다. 코드 그 자체를 수정하지 않는 대신 기존의 코드에 추가 동작(어드바이스)을 추가함으로써 수행하며, "함수의 이름이 'set'으로 시작하면 모든 함수 호출을 기록한다"와 같이 어느 코드가 포인트컷(pointcut) 사양을 통해 수정되는지를 따로 지정한다. 이를 통해 기능의 코드 핵심부를 어수선하게 채우지 않고도 비즈니스 로직에 핵심적이지 않은 동작들을 프로그램에 추가할 수 있게 한다. 관점 지향 프로그래밍은 관점 지향 소프트웨어 개발의 토대를 형성한다
AOP 횡단 관심사(Cross-cutting concern)를 통해 모듈성을 증가시키는 프로그래밍 패러다임입니다.
https://www.codejava.net/frameworks/spring/understanding-spring-aop
그런데 기존에 잘 알고 있던 개념중에 모듈화를 잘 사용하는 개념이 존재합니다!! 바로 객체지향 프로그래밍이죠(Object Oriented Programming, OOP) AOP와 OOP는 어떻게 다른 걸까요??
객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다
OOP는 모든 대상을 객체로 바라보면서 컴퓨터 프로그램을 제작하는 패러다임입니다.
그에 반해 AOP는 코드의 수정 없이 기능을 추가하는 패러다임이죠.
쉽게 말해 핵심 기능은 건들이지 않고 부가적인 기능을 추가하고자 할 때, 주로 사용하는 기법입니다.
이미 OOP가 적용된 상태라고 할 수 있습니다.
따라서 OOP가 더 큰 개념이라고 생각하면 될 듯 하네요
그리고 기능 추가의 방식에도 차이가 존재합니다.
OOP에서 다른 모듈의 기능을 가져오기 위해서는 상속이나 조합(Composition)을 사용합니다.
하지만 AOP는 이와 다르게 어노테이션을 통해 사용할 수 있죠!
그렇다면 AOP를 적용해서 얻을 수 있는 장점은 무엇이 있을까요??
크게 2가지가 있습니다.
AOP로 추가하고자 하는 코드는 주로 핵심 비즈니스 로직이 아닌 부가적인 기능일 때가 많고, 많은 곳에서 사용되는 코드인 경우가 많습니다.
그렇기 때문에 AOP를 통해서 비즈니스 로직은 건들지 않으면서 부가 기능으 추가하고자 할 때, 불필요한 코드의 중복을 피하고자 할 때 AOP를 주로 사용하죠!
처음 AOP가 사용되는 곳들 봤을 때, 저는 DB 연결에도 AOP를 적용시킬 수 있지 않을까? 라는 생각을 했습니다.
하지만 다시 한 번만 더 생각을 해보니 DB연결에 적용시키기에는 다소 부적절하다는 생각을 했습니다.
모든 Layer에서 DB연결이 필요한 것도 아니고, 딱히 DB연결로 인한 코드의 중복도 심하지 않기 때문이죠.
그리고 Chat-GPT 말로는 Spring JDBC 가 DB 연결을 모두 관철하고 있으므로 불필요다는 답변을 줬습니다.
생각해보니 너무 당연하게도 AOP에 적용시키기에 그렇게 적절해 보이지는 않는군요
처음 봤을 때, DB는 많은 부분이 사용해서 AOP를 적용시킬 생각을 했었나 봅니다.
Aspect
은 일련의 관심사를 모듈화하는 Java 클래스@Aspect
를 써서 선언할 수 있음 @advice
어노테이션을 통해 advice
가 될 수 있음어노테이션 별 적용 시점
&&
(and), ||
(or), !
(not) 과 같은 논리 연산자를 사용할 수 있다.Join Point
에 실행되는 Aspect
advice
를 Interceptor
로 동작함Target Advice Object
애 Aspect
를 적용시키는 과정Spring AOP
: Dynamic Proxy에 의해서 런타임 시점에 발생한다.AspectJ
: 컴파일 시점, 클래스 로딩 시점, 런타임 시점 모두를 지원한다.이렇게 딱딱한 용어로만 보면 잘 이해가 되지 않는군요
그럼 그림을 통해 보면서 이해해보도록 해보겠습니다.
프로그램이 실행되면서 여러 개의 메소드가 실행되겠죠, 이것들이 Join Point
입니다.
그리고 여기에 적용하고 싶은 부가 기능이 존재하게 됩니다.
해당 부가 기능은 Aspect
내부의 Advice
입니다.
그리고 해당 부가 기능의 실행 시점이 Pointcut
입니다.
Aspect
= Advice
+ Pointcut
입니다!
이런 AOP가 적용되는 시점은 3가지가 존재합니다.
.java
파일이 .class
파일로 컴파일 되는 시점에 부가 기능이 추가되는 방식.class
파일이 클래스 로더에 보관되기 전에 부가 기능이 추가되는 방식스프링에서 채택한 방법
공감하며 읽었습니다. 좋은 글 감사드립니다.