초웹개_스프링5_AOP(1)

네코·2022년 5월 10일
0

초웹개

목록 보기
6/10
post-thumbnail

개요

pom.xml의 dependency에 aspectjweaver를 추가. 버전은 책과 동일한 1.8.13으로 선택

spring-context 모듈을 추가하면 spring-aop까지 받아와서 따로 추가할 필요없다.
aspectjweaver 모듈은 AOP관련 애노테이션을 제공하므로 따로 추가한 것

factorial을 계산하는 Calculator interface를 각각 반복문(LoopCalculator), 재귀문(RecCalculator)으로 구현한 클래스를 생성한다.
이 때 구현 클래스의 실행 시간을 출력하고자 한다.

간단한 방법은 메서드 시작 시간과 메서드 끝 시간의 차

LoopCalculator는 비교적 간단하다.

RecCalculator의 경우 동일하게 작성할 경우 재귀적 호출이 있으므로 출력이 여러번 발생하게 된다. 따라서 메소드 호출의 전후의 값을 구하는 방법을 택한다.

이러한 방법의 경우 반복되는 코드에서의 수정이 있을 경우 중복된 모든 부분을 수정해줘야하는 번거로움이 있다. => 이를 해결해주는 프록시 객체가 존재한다.

delegate를 통해 의존주입을 받아 주입받은 구현 클래스의 실행 시간을 출력하게 했다.

  • ExeCalculator는 구현이 아닌 역할(추상)에 의존하고 있다.
  • 계산 기능 외 부가 기능을 실행한다. 이 예제에서는 실행 시간 측정
    핵심 기능은 다른 객체에 위임했다.(이 예제에서는 계산)

이런 핵심 기능의 실행은 다른객체에 위임하고 부가적인 기능을 제공하는 객체를 프록시라 한다.
공통 기능과 핵심 기능 구현의 분리가 AOP의 핵심이라고 한다.

위의 예제는 프록시보단 decorator에 가깝다고 한다. 프록시는 접근 제어 관점에 가깝다면 데코레이터는 기능 추가와 확장에 초점을 맞추고 있기 떄문이다.
AOP에서 프록시를 언급하므로 AOP 설명을 위해 예제도 이를 따른 것이라 한다.

AOP

Aspect oriented programing
여러 객체에 공통으로 적용할 수 있는 기능을 분리해서 재사용성을 높이는 프로그래밍 기법.

기본 개념

핵심 기능의 코드를 수정하지 않으면서 공통 기능을 삽입(추가)하는 것.

방법

  1. 컴파일 시점에 코드에 공통 기능을 삽입하는 방법
  2. 클래스 로딩 시점에 바이트 코드에 공통 기능을 삽입하는 방법
  3. 런타임에 프록시 객체를 생성해서 공통 기능을 삽입하는 방법

스프링 aop는 3번 방법을 이용 1,2번은 AspectJ 같은 AOP전용 도구를 사용해서 적용

스프링 aop는 자동으로 프록시 객체를 생성해준다.
앞선 예시의 상위 타입의 인터페이스를 구현한 ExeTimeCalculator와 같은 프록시 클래스를 구현해 줄 필요없다.
공통 기능을 구현한 클래스만 구현하면 된다.

알아야 할 용어

  • Advice: 언제 공통 기능을 핵심 로직에 적용할 것인지를 정의
    Ex) 메소드 호출 전, 트랜잭션 시작
  • Joinpoint : Advice를 적용 가능한 지점
    Ex) 메소드 호출, 필드 값 변경 등
  • Pointcut: Joinpoint의 부분 집합, 실제 Adivce가 적용되는 Joinpoint를 말함
  • Weaving : Advice를 핵심 로직 코드에 적용하는 것
  • Aspect : 여러 객체에 공통으로 적용되는 기능
    Ex) 트랜잭션, 보안

0개의 댓글