공부하는 스누피

[Spring] AOP 정리 본문

Web/Spring

[Spring] AOP 정리

커피맛스누피 2020. 8. 10. 16:10

AOP(Aspect Oriented Programming)

AOP는 여러 객체에 적용되는 공통 기능을 분리하는 프로그래밍 기법으로, 재사용성을 높여준다. OOP는 실제 세계의 사물을 모듈화(객체화)하는 것이지만, AOP는 부가적인 기능을 모듈화하는데 집중한다.

ex) A 클래스와 B 클래스 둘 다 print라는 동일한 기능을 사용해야 할 때, print를 따로 분리한다. A 또는 B 객체를 사용하게 되면 Proxy가 자동으로 print 기능을 실행시켜준다.

스프링에서는 Proxy를 이용해 AOP를 구현한다. 자동으로 Proxy 객체를 만들어 주기 때문에 직접 Proxy 인터페이스를 구현하지 않아도 된다. Bean 객체가 인터페이스를 상속하면 별도 설정이 없는 이상 인터페이스를 이용해서 Proxy를 생성한다.

 

AOP 용어

Aspect: 공통 기능

Advice: 공통 기능을 적용할 곳. 종류가 많은데 Around Advice를 주로 사용함.

Joinpoint: Advice를 적용할 수 있는 지점

Pointcut: Joinpoint의 부분 집합(실제로 적용되는 Joinpoint)

Weaving: Advice를 적용하는 것

 

구현

- @Aspect를 Aspect로 사용할 클래스에 붙이기

- @Pointcut으로 공통 기능 정의하기

- 공통 기능 구현한 메소드에 @Around 붙이기

 

@Aspect 어노테이션

@Aspect를 붙인 클래스를 적용하려면 설정 클래스에 @EnableAspectJAutoProxy를 붙여야 한다. @EnableAspectJAutoProxy의 proxyTargetClass 속성을 true로 하면 Proxy를 생성할 때 자바 클래스를 상속받는다. @Order 어노테이션을 함께 붙이면 @Order에 지정한 값에 따라 적용 순서를 결정한다.

 

@Pointcut 어노테이션

@Pointcut에서 execution 명시자 안에 있는 설정 범위에 속한 Bean 객체의 메소드를 정규식을 사용해 설정한다. 각 패턴은 '*'를 이용해 모든 값을 표현할 수 있고, '..'을 이용해 0개 이상을 표현할 수 있다. 여러 Aspect에 공통으로 사용하는 Pointcut이 있다면 별도 클래스에 정의한다.

기본 형식: execution(수식어패턴? 리턴타입패턴 클래스이름패턴?메소드이름패턴(파라미터패턴))

수식어패턴: 생략 가능. public 주로 사용함.

리턴타입패턴: 리턴 타입 명시

클래스이름패턴, 메서드이름패턴: 정규시으로 패턴 명시

ex) @Pointcut("execution(public * package1 ..*(..))")

-> package1과 그 하위 클래스에 속한 Bean 객체의 public 메소드를 설정

 

@Around 어노테이션

Adivce의 종류 중 하나로, target 메소드 실행 전후에 Advice 기능을 수행한다.

공통 기능이 작동되는 메소드 위에 붙이고 구현할 Pointcut 메소드 이름을 지정해야 한다.

Around의 경우 메소드 호출 전후 작업을 구현해야 하기 때문에 반드시 proceed() 메소드가 호출되어야 한다.

Comments