[Spring]스프링 AOP ( Aspect Oriented Programming )

정호석·2022년 5월 24일
0

Spring AOP란?

AOPAspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다. 관점 지향은 쉽게 말해 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화하겠다는 것이다. 여기서 모듈화란 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것을 말한다.

각각의 색들은 Concern이라고 보면된다. 여기서 Concern이란 여러 클래스, 메서드에 걸쳐서 나타나는 비슷한 코드들을 의미한다.
각 클래스에 있는 Crosscutting Concerns, 흩어진 관심사를 Aspect로 모듈화하고 핵심적인 비즈니스 로직에서 분리하여 재사용하겠다는 것이 AOP의 취지이다.

Spring aop의 특징

프록시 패턴 기반의 AOP 구현체, 프록시 객체를 쓰는 이유는 접근 제어 및 부가기능을 추가하기 위해서임
스프링 빈에만 AOP를 적용 가능
모든 AOP 기능을 제공하는 것이 아닌 스프링 IoC와 연동하여 엔터프라이즈 애플리케이션에서 가장 흔한 문제(중복코드, 프록시 클래스 작성의 번거로움, 객체들 간 관계 복잡도 증가 ...)에 대한 해결책을 지원하는 것이 목적입니다.

Spring aop 주요 개념

▶ Aspect

흩어진 관심사(Crosscutting Concerns)를 묶어서 모듈화 한 것. 하나의 모듈. Advice와 Point Cut이 들어간다.

▶ Target

Aspect가 가지고 있는 Advice가 적용되는 대상(클래스, 메서드 등등)을 말한다.

▶ Advice

어떤 일을 해야할 지에 대한 것. 해야할 일들에 대한 정보를 가지고 있다.

▶ Join Point

가장 흔한 Join Point는 메서드 실행 시점이다. Advice가 적용될 위치, 끼어들 수 있는 지점. 생성자 호출 직전, 생성자 호출 시, 필드에 접근하기 전, 필드에서 값을 가져갔을 때 등등.

▶ Point Cut

Join Point의 상세한 스펙을 정의한 것. 어디에 적용해야 하는지에 대한 정보를 가지고 있다. “A 클래스에 B 메서드를 적용할 때 호출을 해라.”와 같은 구체적인 정보를 준다.

aop 구현방식

  • 의존설정 (pom.xml)
<!-- AOP --> 
<dependency> 
	<groupId>org.aspectj</groupId> 
	<artifactId>aspectjweaver</artifactId> 
	<version>1.7.4</version> 
</dependency>
  • 공통기능의 클래스 제작 - Advice 역할 클래스

    // proxy 
    public class LogAop { 
    	// 경과시간 체크하는 공통기능 메소드 
    	public Object loggerAop(ProceedingJoinPoint joinPoint) throws Throwable {
    		// 
    	} 
    }
    
  • XML설정 파일에 Aspect 설정

<bean id="logAop" class="com.edu.ex.LogAop"></bean> 
<aop:config> 
	<aop:aspect id="logger" ref="logAop"> 
    	<aop:pointcut expression="within(com.edu.ex.*)" id="publicMethod"/> 
    	<aop:around pointcut-ref="publicMethod" method="loggerAop"/> 
    </aop:aspect> 
</aop:config>

예제

helloAop.java

public class HelloAop {
   public static void main(String[] args){
       new HelloAop().sayHello("test");
   }

   private void sayHello(String msg){
       System.out.println(msg);
   }
}

HelloMessage.aj

public aspect HelloMessage {
   poing cut helloCall(): call(* HelloAop.sayHello(..));
   
   before(): helloCall(){
       System.out.println("around");           
   }
}

결과

before
test
around
profile
welcome

0개의 댓글