관리 메뉴

IT.FARMER

Spring AOP Proxy 본문

Spring/Spring Pure

Spring AOP Proxy

아이티.파머 2022. 6. 8. 13:36
반응형

AOP의 의미 (Aspect Oriented Programming)

한글로번역하면 관점지향 프로그래밍이라고 한다. 그렇담 도대체 관점지향이란 무엇인가 ? 흩어진 Aspect 를 모아서 모듈화 할 수 있는 프로그래밍 기법이다. 이것도 당췌 어떤 의미인지 알기 어렵다. 좀더 쉽게 다가가 보자

관점지향이란 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어 본다는 말이고, 이에 따라서 각관점을 기준으로 각각 모듈화 하는 프로그래밍 기법인것이다. 여기서 모됼화란 어떤 공통된 로직이나 기능을 하나의 단위로 묶어주는 것을 말한다. 즉 관점에따라서 각각 모듈화하는 프로그래밍 기법이다.

핵심목표와 부가적인목표

우리가 프로그램작성시 핵심적인 목표로 하는것은 비지니스로직을 실행시키는 것이다. 하지만 부가적인 목표도 존재하는데 예를들면 데이터베이스연결 및 트렌젝션처리, 로깅처리, 재시도처리 등 여러가지 부가목적이 있다.

이때 우리는 각 관점에서 바라보는 핵심목표와 부가적인 목표를 그룹화하여 모듈화 하겠다는것에 의미를 부여하는것이다. 이 모듈화를 진행할때 소스코드상에서 계속적으로 반복되는 코드들을 발견하게 된다. 우리는 이것을 흩어진관심사 라고 부른다. 결국 핵심목표와 부가적인목표의 여러가지 기능중 반복적인 코드들의(흩어진관심사-Crosscutting concerns)를 Aspest로 모듈화하고 핵심적인 비지니스 로직에서 분리하여 재사용 하겠다는 것이 AOP의 취지이다.

아래 그림을 보고 의미를 다시한번 되새겨보자

위에서 이야기 했듯이 서로다른 클레스에서 반복적인 기능을 담당하는 부분이 발생하게된다. 이를 우리는 흩어진관심사라고 불렀다 . 아래 클레스별로 표시된 부분을 흩어진관심사라고한다. (crosscutting cuncerns)

위 그림에서는 각각의 영역에대한(노란색, 파란색, 빨간색) 부분을 개발하거나 유지보수할때 중복되는 메소드 필드 코드를 일일이찾아 다니며 전부 코드를 수정해야 한다. 이렇게 반복되는 코드들을 모듈로 엮어주어 해결하는 방법이 AOP 이다.

이렇게 흩어진 관심사를 AOP는 Aspect 를 이용해서 해결한다.

아래 그림을 보면 위의그림에서 흩어진관심사(Concern) 별로 Aspect를 만들어주고 모듈화 시킨것을 볼수 있다.

결국 모듈화 한다는 이야기는 각각의 클레스에 흩어져있는 반복적이고 공통적인 코드나 기능을 하나의 단위로 묶는 제공하고 사용하는 것이라고 보면된다.

Spring AOP 는 뭐지 ?

아래 그림에서 보듯이 스프링에서도 프록시를 이용하여 AOP 를 구현 할 수 있다. AOP의 핵심기능은 위에서 살펴보았듯이 , 여러 클레스에 흩어져있는 공통기능들을 하나의 모듈로 묶어서 처리 할 수 있는 기술이다.

AOP 적용방법

AOP가 적용되는 시점은 3가지로 볼수 있다.

  • 컴파일 시점에 적용
  • 말그대로 컴파일 시점 .java 에서 .class 로 파일이 만들어질때 바이트코드를 조작하여 AOP가 적용된 바이트 코드를 생성한다.
  • 로드 타임시점에 적용
  • 순수하게 컴파일한뒤 클래스를 로딩하는 시점에 클래스 정보를 변경한다. (Load time weaving)
  • 런타임에 적용
  • 스프링 AOP가 사용하는 방법이다. A 클레스를 Bean으로 만들때 A라는 타입의 Proxy Bean을 만들어 감싼 후에 Proxy Bean이 클래스 중간에 코드를 추가하여 동작되게 한다. 즉 자바파일이 컴파일되고 JVM에 로드되고 나서 AOP @annotation 을 사용하여 코드가 끼워 넣어지는 방법이다.

Spring AOP 의 주요 개념

  • Aspect
    • 흩어진 관심사를 묶어서 모듈화한것, 하나의 모듈에 Advice 와 Point cut 이 들어간다.
  • Target
    • Aspect 가 가지고 있는 Advice가 적용되는 대상 (클레스, 메서드, 어노테이션)
  • Advice
    • 실질적으로 어떤 일을 해야하는지 담고 있다.
    • 실질적인 부가기능을 담은 구현체 이다.
  • JoinPoint
    • Advice 가 적용될 위치, 끼어들수있는지점, 메서드 진입지점, 생성자 호출지저므 필드에서 값을 꺼내올대등 다양한 시점에 적용가능하다.
  • Pointcut
    • Join Point의 상세한 스펙을 정의한 것이다.
    • 어디에 적용햐여 하는지에 대한 정보를 담고 있다.
    • “UserServer.java” 에서 “userSave()” 적용할때 호출해라 와 같이 더 구체적인 Advice 실행될 시점을 지정 할 수 있다.

예시

// Annotation 을 사용한 pointcut 예시  
@Before("@annotation(skan.annotation.Retry)")
@Around(value ="execution(* skan.aop.MemberService.save(String))" +"@annotation(skan.annotation.Retry)")
@AfterReturning(value = "@annotation(skan.annotation.Retry)", returning = "returnObject")
@AfterThrowing(value = "@annotation(skan.annotation.Retry)", throwing = "exception")
@AfterThrowing(value = "@annotation(skan.annotation.Retry)", throwing = "exception")
// 패키지명, 클레스, 메소드명, 인자값을 이용한 pointcut 예시
@Before("execution(* com.aereport.core.crawler.media.v1.facebook.*.*(..))")
@Around("execution(* com.aereport.core.crawler.media.v1.facebook.service.api..*.*(..)) "
      + "|| execution(* com.aereport.core.crawler.media.v3.facebook.api..*.*(..)) )"
  )
@AfterThrowing(pointcut = "execution(* com.aereport.core.crawler.media.v1.facebook.service.api..*.*(..)) || execution(* com.aereport.core.crawler.media.v3.facebook.api..*.*(..))", throwing = "ex")

그럼 언제 사용해야할까?

반응형

'Spring > Spring Pure' 카테고리의 다른 글

Sring boot jpa log 설정  (0) 2022.11.04
Spring AOP (Aspect Oriented Programming)  (0) 2022.06.08