본문 바로가기
Web/Spring

[ Spring ] AOP 사용법 정리

AOP (Aspect Oriented Programming)

AOP 는 Aspect Oriented Programming 의 약자로 관점 지향 프로그래밍 이라고 불린다.

AOP 의 기능은

- 횡단 관심사를 분리해서 제작 가능하다.

( 비즈니스 로직은 아니지만, 반드시 처리가 필요한 부분 )

  • 보안

  • 로그

  • 트랜잭션

- 개발자가 비즈니스 로직에만 집중할 수 있게 한다.


사용 방법

1. pom.xml 에 aop dependency 추가

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>4.0.0.RELEASE</version>
    </dependency>
    <dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.8.0</version>
</dependency>

dependencies 안에 위의 dependency를 추가해 준다.

 

2. src 에 test.util 폴더를 생성해서 WritingUtil 클래스를 생성한다 ( 예제 )

package test.util;

import org.springframework.stereotype.Component;

@Component
public class WritingUtil {
	public void write1() {
		System.out.println("편지를 써요");
	}
	public void write2() {
		System.out.println("보고서를 써요");
	}
	public void write3() {
		System.out.println("일기를 써요");
	}
}
  • @Component

  • 테스트용 함수 3개를 만든다. 

 

3. src 에 test.aspect 폴더를 만들고 WritingAspect 클래스를 생성한다

package test.aspect;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

/*
  	Aspect : 공통 관심사 (횡단 관심사)
  	
  	- 핵심 비즈니스 로직과는 상관 없는 공통 관심사를 따로 작성한다.
 */
@Aspect //aspect 역할을 할 수 있도록 필요한 어노테이션
@Component //component scan 을 통해서 bean 이 될 수 있도록
public class WritingAspect {
	@Before("execution(void write*())")
	public void prepare() {
		System.out.println("pen 을 준비해요");
	}
	@After("execution(void write*())")
	public void finish() {
		System.out.println("pen 을 다시 정리해요");
	}
}
  • @Aspect 

  • @Component 

  • @Before 

  • @After 

 

4. src에 test.aop 폴더를 만들고 init.xml 파일을 생성 후 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
	<context:component-scan base-package="test.util"/>
	<context:component-scan base-package="test.aspect"/>
	<!-- 어노테이션 기반으로 aop 를 작동 적용하기 위한 설정 -->
	<aop:aspectj-autoproxy/>
</beans> 

코드를 추가해 줍니다. 

  • <context : component - scan base - package="test.util"/>

  • <context : component - scan base - package="test.aspect"/>

  • <aop : aspectj-autoproxy />

 

5. test.aop 폴더에 MainClass 생성

package test.aop;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;

import test.util.WritingUtil;

@Component
public class MainClass {
	public static void main(String[] args) {
		//init.xml 문서를 로딩한다. (spring bean container 를 만든다)
		ApplicationContext context=new ClassPathXmlApplicationContext("test/aop/init.xml");
		//spring bean  container 에서 WritingUtil type 의 참조값 얻어오기
		WritingUtil util=context.getBean(WritingUtil.class);

		util.write1();
		util.write2();
		util.write3();
	}
}
  • @Component

  • ApplicationContext context=new ClassPathXmlApplicationContext("test/aop/init.xml") 

  • context.getBean(WritingUtil.class)


결과

  • MainClass 에서는 < 사용방법 2 > 에서 만든 WritingUtil 의 메소드를 호출 ( 사용방법 5 ) 했지만

  • 결과에는

    < 사용방법 3 > 에 정의한 @before, @after함께 출력된 것을 볼 수 있다.

 

결론

AOP 는 비즈니스 로직은 아니지만,

반드시 처리가 필요한 부분들을 따로 작업을 해서 관리하는 것이다!!!

이 기능 때문에 개발자는 비즈니스 로직에만 집중할 수 있게 된다!!!