티스토리 뷰

Spring

스프링 AOP -1

엔꾸꾸 2019. 5. 4. 23:19

 

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");
 }
}

예제 코드가 실제 프로덕션 레벨에서 쓰일만한 코드느 아니지만 이해를 돕기위해 작성한 코드이기에 이해바란다.

  1. MemberService, EventService 가 존재한다.
  2. 두 서비스의 비지니스 로직 전 후 로 Logging 작업 (공통부분) 이 존재한다.
  3. Logging작업을 제외한 비지니스로직 (DB 동기화부분) 은 핵심 로직이다.

위의 예제 코드에서 2번에 해당하는부분 (Logging작업) 이 횡단 관심사에 해당하고
3번에 해당하는부분이 핵심 관심사에 해당한다.

정리하자면 , 다수의 모듈에 공통적으로 나타나는 부분이 존재하는데 이것을 ‘횡단관심사 (Cross-Cutting-Concern) 이라고하고 , 비지니스 로직의 핵심부분 (예제코드에서는 DB동기화부분) 에 해당하는 것을 ‘핵심 관심사’ 라고한다.

‘스프링 DI 가 의존성에 대한 주입이라면 , AOP는 로직에 대한 주입이다’ 라고 했는데
로직을 주입한다면 어디에 주입할 수 있을까 ?

  • 로직을 주입할 수 있는 부분은 아래와 같이 총 5군데이다.
  1. Around
    • 로직실행 전 후
  2. Before
    • 로직 실행 전
  3. After
    • 로직 실행 후
  4. AfterReturning
    • 로직 메서드 종료 후
  5. AfterThrowing
    • 로직 실행 중 에러 발생시

스프링 AOP는 프록시를 사용한다 .
MemberService의 createMember(); 메서드를 호출하면 , 프록시가 그 요청을 받아 MemberService객체로 요청을 전달한다.

스프링 AOP의 핵심은 3가지로 요약 가능하다.

  1. 인터페이스 기빈아다.
  2. 프록시 기반이다.
  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의 간단한 설명을 하자면 ..

  1. @Aspect
    • 해당 클래스를 이제 AOP로 사용하겠다는 의미이다.
  2. @Around
    • 대상 메서드를 실행 전 후에 이 메서드를 실행하겠다는 의미이다.
  3. 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
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함