Spring(스프링), Spring Boot(스프링부트), JSP

스프링(spring) AOP란? spring AOP 구현하기[1] : xml 스키마로 구현

알통몬_ 2018. 1. 5. 09:30
반응형


공감 및 댓글은 포스팅 하는데

 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 

도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 

만들어 나가겠습니다^^

 


AOP : Aspect Oriented Programming - 관점 지향 프로그래밍


프로그램 개발 시 공통되는 기능들이 많이 사용됩니다.

대표적으로 로그가 있겠죠?

이러한 공통되는 기능들을 여러 모듈에 적용하기 위한 방법으로는

상속이 있습니다.

이 방법에는 문제가 있습니다.

자바에서는 기본적으로 다중 상속이 지원되지 않기 때문에

다양한 모듈에 상속을 통해서 공통 기능을 주는데에는 한계가 있고,

기능 구현 부분에 핵심코드와 함께 공통 기능코드가 함께 있기 때문에

효율성이 떨어집니다.


이러한 한계 때문에 AOP가 나왔습니다.

AOP 방법은 핵심 기능과 공통 기능을 분리하고,

공통 기능을 필요로 하는 핵심 기능들에서 사용하는 방법입니다.


AOP에 사용되는 용어 5가지

Aspect : 공통 기능을 말합니다.

Advice : Aspect의 기능 자체를 말합니다.

Jointpoint : Advice를 적용해야 하는 부분입니다. 필드나 메소드이고, 스프링에서는 메소드만

해당됩니다.

Pointcut : Jointpoint의 부분,  실제로 Advice가 적용된 부분

Weaving : Advice를 핵심 기능에 적용하는 행위를 말합니다.


[ 광고 보고 가시죠! ]



[ 감사합니다! ]


스프링에서 AOP를 구현할 때는 대행자[Proxy]를 사용합니다.

구현 방식에는 2가지가 있습니다.

- XML 스키마 기반의 구현

- @Aspect 어노테이션 기반의 구현

이번 포스팅에서는 xml 스키마 기반의 구현 방법에 대해 공부합니다.


구현하기.

1. pom.xml 에 의존설정하기

1
2
3
4
5
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.7.4</version>
        </dependency>
cs


2. 공통기능으로 사용될 클래스만들기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package org.mon.altong.aop;
 
import org.aspectj.lang.ProceedingJoinPoint;
 
public class PublicAop {
 
    public Object aopLogger(ProceedingJoinPoint jointPoint) throws Throwable {
        String signStr = jointPoint.getSignature().toShortString();
        System.out.println(signStr + "  시작됨");
        long start = System.currentTimeMillis();
        
        try {
            Object object = jointPoint.proceed();
            return object;
        } finally {
            long end = System.currentTimeMillis();
            System.out.println(signStr + " 종료됨");
            System.out.println(signStr + " 경과 시간 : " + (start - end));
        }
    }
}
 
cs

aopLogger 라는 함수를 만들었고, 어떠한 핵심 기능이 실행되기 전에 

signStr + "시작됨" 이 출력되고, 핵심 기능 실행 후

signStr + "종료됨" 이 출력되고, 경과시간이 출력되도록 만들었습니다.


3. 핵심 기능이 담긴 클래스 만들기

Worker.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package org.mon.altong.aop;
 
public class Worker {
 
    private String name;
    private int age;
    private String job;
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getJob() {
        return job;
    }
    public void setJob(String job) {
        this.job = job;
    }
    
    public void workerInfo() {
        System.out.println(getName());
        System.out.println(getAge());
        System.out.println(getJob());
    }
    
}
 
cs


4. 스프링설정.xml 파일에 Aspect 설정 및 bean 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
 
    <!-- aop로 사용될 메소드가 있는 클래스 -->
    <bean id="publicAop" class="org.mon.altong.aop.PublicAop"/>
    
    <!-- aop:pointcut 의 id는 사용자가 임의로 정하면 됩니다. 
        expression="within=()" 안의 값은 적용범위입니다.
        제가 선언한 경우는 org.mon.altong.aop 패키지 안에 있는 모든 클래스에 적용한다는 의미입니다.
    -->
    <aop:config>
        <aop:aspect id="logger" ref="publicAop">
            <aop:pointcut id="publicLogger" expression="within(org.mon.altong.aop.*)"/>
            <aop:around pointcut-ref="publicLogger" method="aopLogger"/>
        </aop:aspect>
    </aop:config>
 
 
    <!-- aop 공통 기능을 적용시킬 핵심 기능이 담긴 클래스 -->
        <bean id="worker" class="org.mon.altong.aop.Worker">
        <property name="name" value="근육몬"/>
        <property name="age" value="27"/>
        <property name="job" value="Dev"/>
    </bean>
</beans>
 
cs


5. 테스트

Running.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package org.mon.altong.aop;
 
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
 
public class Running {
 
    public static void main(String[] args) {
        
        String loc = "classpath:aopContext.xml";
        
        AbstractApplicationContext ctx = new GenericXmlApplicationContext(loc);
        Worker worker = ctx.getBean("worker", Worker.class);
        worker.workerInfo();
        
    }
}
  
cs


6. 실행 결과


* AOP 가 제대로 적용되었다면, xml 파일에 아래 이미지 처럼 화살표가 보여집니다.


이상입니다.

감사합니다.


반응형