티스토리 뷰
Spring - AOP
AOP란 ?
- AOP는 Aspect-Oriendted-Programming의 약자로 , 이를 번역하면 관점지향 프로그래밍이다.
- 스프링의 DI가 의존성주입이라면, AOP는 로직의 주입이라고 볼 수 있다.
- AOP는 OOP의 단점을 보완하기위해 나온것이다. OOP를 대체하는 개념은 아니다.
핵심관심사 ? 횡단관심사 ?
- 특정 로직중 공통적으로 일어나는부분 을 횡단 관심사, 그외의 특정부분을 핵심관심사라고 한다.
아래의 코드를 한번 살펴보자.
@Service
@RequriedArgsConstructor
class MemberService {
private Logger logger = LoggerFactory.getLogger(MemberService.class);
private final MemberRepository repository;
public void createMember() {
logger.info("start create Member ...");
repository.createMember();
logger.info("end create Member");
}
}
@Service
@RequriedArgsConstructor
class EventService {
private Logger logger = LoggerFactory.getLogger(EventService.class);
private final EventRepository repository;
public void createEvent() {
logger.info("start create Event ...");
repository.createEvent();
logger.info("end create Event");
}
}
예제 코드가 실제 프로덕션 레벨에서 쓰일만한 코드느 아니지만 이해를 돕기위해 작성한 코드이기에 이해바란다.
- MemberService, EventService 가 존재한다.
- 두 서비스의 비지니스 로직 전 후 로 Logging 작업 (공통부분) 이 존재한다.
- Logging작업을 제외한 비지니스로직 (DB 동기화부분) 은 핵심 로직이다.
위의 예제 코드에서 2번에 해당하는부분 (Logging작업) 이 횡단 관심사에 해당하고
3번에 해당하는부분이 핵심 관심사에 해당한다.
정리하자면 , 다수의 모듈에 공통적으로 나타나는 부분이 존재하는데 이것을 ‘횡단관심사 (Cross-Cutting-Concern) 이라고하고 , 비지니스 로직의 핵심부분 (예제코드에서는 DB동기화부분) 에 해당하는 것을 ‘핵심 관심사’ 라고한다.
‘스프링 DI 가 의존성에 대한 주입이라면 , AOP는 로직에 대한 주입이다’ 라고 했는데
로직을 주입한다면 어디에 주입할 수 있을까 ?
- 로직을 주입할 수 있는 부분은 아래와 같이 총 5군데이다.
- Around
- 로직실행 전 후
- Before
- 로직 실행 전
- After
- 로직 실행 후
- AfterReturning
- 로직 메서드 종료 후
- AfterThrowing
- 로직 실행 중 에러 발생시
스프링 AOP는 프록시를 사용한다 .
MemberService의 createMember(); 메서드를 호출하면 , 프록시가 그 요청을 받아 MemberService객체로 요청을 전달한다.
스프링 AOP의 핵심은 3가지로 요약 가능하다.
- 인터페이스 기빈아다.
- 프록시 기반이다.
- 런타임 기반이다.
AOP 적용
- AOP에 대해 어느정도 알았으니 이제 실제 적용방법을 알아야하지 않겠는가
- 간단한 예제 코드를 살펴보며 AOP사용법에 대해 간단히 맛보도록 하자.
@Aspect
class LoggingAspect {
private Logger logger = LoggerFactory.getLogger(LoggingAspect.class);
@Around("execution(* me.june.service.*.* ())")
public Object around(JoinPoint joinPoint) {
logger.info("start ...");
Object returnValue = joinPoint.proceed();
logger.info("end ...");
return returnValue;
}
}
@Service
@RequriedArgsConstructor
class MemberService {
private final MemberRepository repository;
public void createMember() {
repository.createMember();
}
}
@Service
@RequriedArgsConstructor
class EventService {
private final EventRepository repository;
public void createEvent() {
repository.createEvent();
}
}
- 이전에 작성했던 코드와 비교했을때 차이가 느껴지는가 ?
- 공통적인부분 (횡적 관심사) 부분 과 핵심부분이 분리되어 각 서비스에 중복적으로 나타나던 코드들이 사라졌다.
- LoggingAspect에 나오는 코드들은 다소 생소한부분이 있을것이다.
- 해당 부분들을 하나씩 차근차근 살펴보도록하자.
LoggingAspect class의 간단한 설명을 하자면 ..
- @Aspect
- 해당 클래스를 이제 AOP로 사용하겠다는 의미이다.
- @Around
- 대상 메서드를 실행 전 후에 이 메서드를 실행하겠다는 의미이다.
- JoinPoint
- 간단하게 설명하자면 핵심관심사에 해당하는 부분 , AOP가 적용가능한 지점 을 의미한다.
정리
- AOP는 횡단관심사와 핵심관심사를 분리하여 중복을 제거하기위해 나온 개념이다.
- OOP의 한계를 극복하기위해 나온개념이지 , OOP를 완전히 대체하지는 못한다.
이번 포스트에서는 AOP의 개념들과 , 간단한 예제 코드를 살펴보았다.
다음 포스트에는 AOP의 각종 용어들과 실질적인 사용법에 대해 자세히 알아보도록 하자
'Spring' 카테고리의 다른 글
Spring - PSA (0) | 2019.05.19 |
---|---|
스프링 AOP - 2 (0) | 2019.05.12 |
스프링을 활용한 의존성주입 - 2 (0) | 2019.05.01 |
스프링을 활용한 의존성주입 - 1 (0) | 2019.04.28 |
DI - 의존성주입 (0) | 2019.04.28 |
댓글