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 는 비즈니스 로직은 아니지만,
반드시 처리가 필요한 부분들을 따로 작업을 해서 관리하는 것이다!!!
이 기능 때문에 개발자는 비즈니스 로직에만 집중할 수 있게 된다!!!