본문 바로가기
Spring

AOP 정리

by 홍굴이 2021. 6. 2.

AOP란?

  • Aspect-Oriented Programming : 관점(관심)지향 프로그래밍
  • 애플리케이션 전체에 걸쳐 사용되는 기능을 재사용하도록 지원
  • 장점
    1. 애플리케이션 전체에 흩어진 공통 기능을 하나의 장소에서 관리
    2. 다른 서비스 모듈들을 본인의 목적에만 충실하게 함
  • 위의 그림에서 Service의 핵심 기능은 공통된 요소가 없습니다.
    하지만, 부가기능 이란 과점으로 보면 상황이 달라집니다.

각각 Service는 로그를 기록하는 logging()이라는 메소드가 공통적으로 들어가는 것을 확인할 수 있습니다.

기존에 OOP에서 바라보던 관점을 다르게 하여 부가기능적인 측면에서 보았을 때 공통된 요소를 추출하는 것 입니다.

 

[요약]

  • OOP : 비지니스 로직의 모듈화
    • 모듈화의 핵심 단위는 비지니스 로직
  • AOP : 인프라 혹은 부가기능의 모듈화
    • 대표적 예 : 로깅, 트랜잭션, 보안 등
    • 각각의 모듈들의 주 목적 외에 필요한 부가적인 기능들

AOP 용어

  1. Target
    • 부가기능을 부여할 대상 ex) 각 Service들
  2. Aspect
    • 부가기능 모듈들
  3. Advice
    • 실질적으로 부가기능을 담을 구현체
  4. PointCut
    • 부가기능이 적용될 대상(메소드)를 선정하는 방법
  5. JoinPoint
    • Advice가 적용될 수 있는 위치

실습

Build.gradle

//Spring AOP
implementation 'org.springframework.boot:spring-boot-starter-aop'
  • 의존성 추가

Aspect 코드

@Component
@Aspect
public class RequestLogAspect {

    Logger logger = LoggerFactory.getLogger(RequestLogAspect.class);

    @Pointcut("execution(* kr.co.player.api.interfaces.controller.*.*(..))")
    public void loggerPointCut() {
    }

    @Around("loggerPointCut()")
    public Object printRequestLog(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        long start = System.currentTimeMillis();
        Object result = proceedingJoinPoint.proceed();
        long end = System.currentTimeMillis();

        logger.info("수행 시간 : " + (end - start));

        return result;
    }
}
  • @Aspect어노테이션을 사용하여 Aspect를 나타내는 클래스임을 명시
  • @Component를 사용하여 클래스를 Spring Bean으로 등록
  • Advice(시점)
    • @Before(전) : 어드바이스 타겟 메소드가 호출되기 전에 어드바이스를 수행
    • @After(후) : 타겟 메소드 결과에 관계없이 타겟 메소드가 완료되면, 어드바이스 기능을 수행
    • @AfterReturning(정상적 변환 이후) : 타겟 메소드가 성공적으로 결과값을 반환 후에 어드바이스 기능을 수행
    • @AfterThrowing(예외 발생 이후) : 타겟 메소드가 수행 중 예외를 던지게 되면 어드바이스 기능을 수행
    • @Around(메소드 실행 전 후) : 어드바이스가 타겟 메소드를 감싸서 타겟 메소드 호출전과 후에 어드바이스 기능을 수행
  • proceedingJoinPoint.proceed()
    • Around 어드바이스의 경우 메소드 실행 전 후로 나뉘기 때문에 타겟 메소드에 대한 정보를 호출해야한다. proceed()가 호출 되기 전에는 타겟 메소드 호출 전, proceed()가 호출된 후에는 타겟 메소드 호출 후으로 나뉜다. proceed()의 반환 값인 Object는 타겟 메소드를 실행한 후의 결과 값들이 담겨있다.
  • "execution(* kr.co.player.api.interfaces.controller..(..))"
    • 포인트컷 표현식이라고 함
    • execution : 지정자
      • 접근제한자, 리턴타입, 인지타입, 클래스/인터페이스, 메소드명, 파라미터타입, 예외타입 등을 전부 조합한 가장 세심한 지정자
      • 풀패키지에 메소드명까지 직접 지정할 수도 있으며, 아래와 같이 특정 타입내의 모든 메소드를 지정할 수도 있다.
    • (* kr.co.player.api.interfaces.controller..(..)) : 타겟 명세

 

참조

https://jojoldu.tistory.com/71

'Spring' 카테고리의 다른 글

커스텀 어노테이션 (@Target, @Retention)  (0) 2021.06.03

댓글