안녕하세요. 오늘은 Spring AOP에 대해서 알아보고 실제로 적용하는 방법에 대해서 이야기해보고자합니다. AOP는 [Spring] Spring의 정의와 기본 개념에서 Spring을 비침투적인 기술로 만들기위한 3가지 기술중 하나라고 언급한 적이있습니다.
오늘부터는 Spring AOP에 대해서 알아보는 시간을 가져보도록 하겠습니다.
AOP
먼저 아래 코드의 상황을 보면서 문제를 이해해보도록 하겠습니다.
doSomething
이라는 메서드가 있습니다. 이 메서드는 어떤 바쁜 일을 합니다. 이렇게 운영하던 중 새로운 요구사항이 들어왔습니다. 바로 doSomething
메서드가 실행되는 시간을 찍어달라고 합니다. 그렇다면 우리는 아래와 같이 timeCheck
메서드를 만들어 코드를 작성할 수 있습니다.
public void timeCheck() {
Stopwatch stopwatch = Stopwatch.createStarted();
doSomething();
stopwatch.stop();
log.info("time : " + stopwatch.elapsed(MILLISECONDS));
}
public void doSomething() {
...
}
timeCheck 메서드의 flowchart를 그리면 아래와 같습니다.
실제 우리의 비즈니스에 필요한 로직은 doSomething
메서드 뿐이며, 나머지는 부가적인 기능이라는 것을 알 수 있습니다.
그리고 새로운 요구사항이 나왔다고 하겠습니다. 바로 doSomething_2
메서드를 만들고 그 메서드가 실행되는 시간을측정해 달라는 달라는 요구사항입니다. 해당 요구사항을 만족시키는게 어렵지는 않습니다. doSomething_2
메서드를 만들고 timeCheck
메서드 처럼 시간을 측정하는 메서드를 또 만들면 됩니다. 그렇다면 위의 이미지, 코드와 같은 구성을 가지게 될 것입니다.
이렇게 코드를 구성했을 때 코드의 문제점이 무엇일까요 ?
- N개의 메서드가 있을 때 N개의 시간측정 메서드가 필요하며 만약 Log출력에서 Log내용을 바꿔야한다면 N번 작업해야한다.
- 비즈니스 로직과 기능적인 역할을 하는 코드가 같은 Class 안에 혼재될 수 밖에 없다.
- 시간측정 코드는 중복코드가 된다.
이때 우리의 코드를 개선할 수 있는 방법으로 디자인 패턴 중 하나인 Strategy 패턴을 사용할 수 있습니다. 그리고 또 다른 하나가 Spring의 핵심가치중 하나인 AOP입니다. AOP는 Aspect Oriented Programing, 즉 관점지향프로그래밍이라고 하며 공통되게 사용되는 기능적인 역할을 하는 코드를 재활용하여 사용할 수 있도록 만들어주는 방법입니다.
AOP를 이용하면 우리의 Class에는 빨간 박스안의 비즈니스 로직만을 남길수 있으며 나머지 기능적인 역할을 하는 코드들을 다른 Class로 뺄 수 있게 됩니다. 때문에 AOP 기능을 Cross-Cutting 기능이라고도 부릅니다.
AOP의 용어
본격적으로 AOP를 사용하기에 앞서서 AOP를 사용함에 있어 용어를 먼저 정리해보도록 하겠습니다.
- Aspect : 기능적인 역할을 하는 모듈, 위의 예제에서 실제 비즈니스 로직을 제외한 기능적인 역할을 하는 코드들을 분리, 재사용 할 수 있도록한 모듈. Aspect는 Advice와 PointCut으로 이루어져 있습니다.
- Advice : AOP에서 실제 실행되는 코드를 이야기합니다. 순수하게 실행되는 코드만을 뜻합니다.
- Join Point : Advice를 실제로 실행 하고자 하는 위치를 뜻합니다. Spring AOP는 메서드에 한정됩니다. 즉, Spring AOP에서 모든 메서드는 Join Point가 될 수 있습니다.
- PointCut : Advice가 적용될 JoinPoint를 선정하는 방법을 이야기합니다. 모든 Join Point에 Advice를 적용하는 것이 아닌 특정 Join Point에 Advice를 적용하는것이 일반적입니다. 따라서 Advice를 사용할 JoinPoint를 선정하는 방법이 PointCut입니다.
- Target : Advice가 적용되어지는 기존 메서드, 클래스 등을 뜻합니다.
- AOP Proxy : Spring에서 AOP는 Dynamic Proxy 기법으로 AOP를 구현하고 있습니다. 즉, 우리가 AOP가 적용된 Target 메서드를 호출 할 때 바로 그 메서드가 호출되는 것이 아니라 Advice가 요청을 대신 랩핑(Wrraping) 클래스로써 받고 그 랩핑 클래스가 Target을 호출합니다. AOP의 자세한 원리는 다음에 자세히 알아보도록 하겠습니다.
- Introduction : AOP를 적용할 때 내부적으로 코드를 생성 (Spring의 경우 wraaping class)하는 것을 말합니다.
- Weaving : Aspect가 target에 적용되는 전체적인 과정을 말합니다. 즉, PointCut으로 지정된 JoinPoint에 Advice가 적용되어 Target을 호출 시 AOP Proxy가 만들어지는 과정입니다.
마무리
오늘은 이렇게 AOP에 대해서 알아보는 시간을 가졌습니다. AOP는 총 3개의 포스팅으로 구성될 예정입니다. 오늘은 간단한 이론을 알아봤습니다. 앞으로 두번의 포스팅에 걸쳐서는 Spring Boot를 이용한 실습편과 AOP를 조금 더 깊게 이해 해보는 원리편으로 다루고자 합니다.
감사합니다.
참조
https://jojoldu.tistory.com/71
https://www.geeksforgeeks.org/aspect-oriented-programming-and-aop-in-spring-framework/
'language, framework, library > Spring' 카테고리의 다른 글
[Spring] Spring AOP - 원리편 (1) | 2020.07.01 |
---|---|
[Spring] Spring AOP - 실전편 (3) | 2020.06.23 |
[Spring] Spring의 IoC/DI Container (0) | 2020.03.21 |
[Spring] Spring의 핵심 기술 IoC / DI (0) | 2020.03.02 |
[Spring] Spring의 정의와 기본 개념 (2) | 2020.02.21 |
댓글