블로그를 이전하였습니다. 2023년 11월부터 https://bluemiv.github.io/에서 블로그를 운영하려고 합니다. 앞으로 해당 블로그의 댓글은 읽지 못할 수 도 있으니 양해바랍니다.
반응형
AOP
AOP는 Aspect Oriented Programming
의 약자로, 번역하면 관점 지향 프로그래밍이다.
AOP는 주 비지니스 로직 앞, 뒤로 부가적인 기능을 추가하고 싶을때 사용하는데
- 예를들어, 로그처리, 보안처리, DB 트랜잭션 처리 등이 있다
관점을 횡단으로 바꿔서 바라보는 것을 횡단 관심 사항이라 하며,
부가적인 로직을 Cross Cutting Concern
, 주 비즈니스 로직을 Core Concern
이라 한다.
AOP를 사용하는 이유?
- 코드의 중복을 줄일 수 있다.
- 주 업무 로직과 부가적인 로직을 분리할 수 있다.
Java로 AOP 구현
AOP는 디자인 패턴 중 프록시 패턴(Proxy Pattern
)을 이용해서 구현할 수 있다.
- 스프링에서는 어노테이션으로 더 쉽게 구현할 수 있음
성능 측정을 위해 아래와 같이 코드를 작성했다고 하면, 비즈니스 로직과 부가적인 로직이 구분없이 함께 구현이 된다.
public interface CoreConcern {
int coreLogic(int totalCount);
}
public class CoreConcernImpl implements CoreConcern {
@Override
public int coreLogic(int totalCount) {
System.out.println("비즈니스 로직 실행");
int count = 0;
for(int i=0; i<totalCount; i++)
count++;
return count;
}
}
// ...
@Test
@DisplayName("AOP 테스트")
void aopTest() {
// 부가적인 로직 ------------
StopWatch sw = new StopWatch();
sw.start();
// -----------------------
// 비즈니스 로직 -----------
CoreConcern coreConcern = new CoreConcern();
int result = coreConcern.coreLogic(10000);
// -----------------------
// 부가적인 로직 ------------
sw.stop();
System.out.println("소요 시간: " + sw.getTotalTimeSeconds());
// -----------------------
}
위 코드를 AOP로 구현해보자
- 구현하기 위해
Proxy
패턴을 이용한다. - Java에는
Proxy.newProxyInstance
로 프록시를 생성할 수 있다
@Test
@DisplayName("AOP 테스트 2")
void aopTest2() {
CoreConcern coreConcern = new CoreConcernImpl();
CoreConcern proxyCoreConcern = (CoreConcern) Proxy.newProxyInstance(
CoreConcernImpl.class.getClassLoader(),
new Class[]{CoreConcern.class},
// 앞, 뒤 부가로직 구현
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 부가적인 로직 ------------
StopWatch sw = new StopWatch();
sw.start();
// -----------------------
int result = (int) method.invoke(coreConcern, args);
// 부가적인 로직 ------------
sw.stop();
System.out.println("소요 시간: " + sw.getTotalTimeSeconds());
// -----------------------
return result;
}
}
);
// 실행
// - 비즈니스 로직을 실행하면, 프록시 패턴에 의해 앞뒤로 부가기능이 실행된다.
// - 부가기능을 제거하거나 내용을 변경하면서 일괄적으로 적용된다
proxyCoreConcern.coreLogic(1000);
proxyCoreConcern.coreLogic(2000);
proxyCoreConcern.coreLogic(3000);
}
비즈니스 로직 실행
소요 시간: 7.53E-5
비즈니스 로직 실행
소요 시간: 3.77E-5
비즈니스 로직 실행
소요 시간: 3.98E-5
Spring Boot에서 AOP 구현은 아래 글 참고
2021.03.11 - [Spring/Spring Boot] - Spring Boot에서 AOP 구현 (Aspect Oriented Programming)
다른 글
2021.03.10 - [Spring] - Spring의 DI 개념 (Dependency Injection)
2021.03.10 - [Spring] - Spring의 IoC 컨테이너 (Inversion of Control)
반응형
'Backend > Spring' 카테고리의 다른 글
Spring @ResponseBody를 이용하여 데이터 반환 (API 개발) (1) | 2021.05.17 |
---|---|
Spring의 IoC 컨테이너 (Inversion of Control) (0) | 2021.03.10 |
Spring의 DI 개념 (Dependency Injection) (2) | 2021.03.10 |