SW/Java

Java : Spring : Execution 명시자 : 종류,개념, 사용 방법, 예제, 구현

얇은생각 2020. 6. 13. 07:30
반응형

 

Execution 명시자

Pointcut을 지정할 때 사용하는 문법입니다.

execution : 접근 제한자, 리턴 타입, 클래스이름, 메서드 이름(매개변수)

접근 제한자 : pulic만 지원됩니다.

리턴타입 : 메서드의 매개변수 타입

클래스 이름 : 패키지를 포함한 클래스 이름

메서드 이름 : 메서드의 이름

매개변수 : 매개변수의 형태

* : 하나의 모든 것을 의미합니다.

.. : 개수 상관없이 모든 것을 의미합니다.

 

 

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>kr.co.softcampus</groupId>
	<artifactId>ExecutionDirective</artifactId>
	<version>0.0.1-SNAPSHOT</version>

	<!-- xml에서 사용할 속성들 -->
	<properties>
		<!-- 자바 버전 -->
		<java-version>1.8</java-version>
		<!-- 스프링 버전 -->
		<org.springframework-version>5.1.9.RELEASE</org.springframework-version>
		<!--<org.springframework-version>4.3.25.RELEASE</org.springframework-version> -->
		<org.slf4j-version>1.7.26</org.slf4j-version>
		<ch.qos.logback-version>1.2.3</ch.qos.logback-version>
		<javax.annotation-version>1.3.2</javax.annotation-version>
		<org.aspectj-version>1.9.4</org.aspectj-version>
	</properties>

	<!-- 프로젝트에서 사용할 라이브러리 정보 -->
	<dependencies>
		<!-- spring context -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<!-- slf4j -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>${org.slf4j-version}</version>
		</dependency>
		<!-- logback -->
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
			<version>${ch.qos.logback-version}</version>
			<exclusions>
				<exclusion>
					<groupId>org.slf4j</groupId>
					<artifactId>slf4j-api</artifactId>
				</exclusion>
			</exclusions>
			<scope>runtime</scope>
		</dependency>
		<!-- https://mvnrepository.com/artifact/javax.annotation/javax.annotation-api -->
		<dependency>
			<groupId>javax.annotation</groupId>
			<artifactId>javax.annotation-api</artifactId>
			<version>${javax.annotation-version}</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
			<version>${org.aspectj-version}</version>
		</dependency>


	</dependencies>
</project>

 

beans.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:context="http://www.springframework.org/schema/context"
	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/context
	                    http://www.springframework.org/schema/context/spring-context.xsd
	                    http://www.springframework.org/schema/aop
	                    http://www.springframework.org/schema/aop/spring-aop.xsd">
	                    
	<bean id='xml1' class='kr.co.softcampus.beans.TestBean1'/>    
	<bean id='xml2' class='kr.co.softcampus.beans.TestBean2'/>
	<bean id='xml3' class='kr.co.softcampus.beans2.TestBean1'/>
	
	<bean id='advisor1' class='kr.co.softcampus.advisor.AdvisorClass'/>
	
	<aop:config>
		<aop:aspect ref='advisor1'>
			
			<!-- 반환타입이 void, kr.co.softcampus.beans.TestBean1 클래스, method1 메서드, 매개변수 없음 -->
			<!-- <aop:pointcut id="point1" expression="execution(void kr.co.softcampus.beans.TestBean1.method1())"/> -->
			
			<!-- 반환타입이 void, kr.co.softcampus.beans.TestBean1 클래스, method1 메서드, 정수형 매개변수 1개 -->
			<!-- <aop:pointcut id="point1" expression="execution(void kr.co.softcampus.beans.TestBean1.method1(int))"/> -->
			
			<!-- 반환타입이 void, kr.co.softcampus.beans.TestBean1 클래스, method1 메서드, String 타입 매개변수 1개 -->
			<!-- <aop:pointcut id="point1" expression="execution(void kr.co.softcampus.beans.TestBean1.method1(java.lang.String))"/> -->
			
			<!-- 반환타입이 void, kr.co.softcampus.beans.TestBean1클래스, method1 메서드, 모든 타입의 매개변수 1개 -->
			<!-- <aop:pointcut id="point1" expression="execution(void kr.co.softcampus.beans.TestBean1.method1(*))"/> -->
			
			<!-- 반환타입이 void, kr.co.softcampus.beans.TestBean1클래스, method1 메서드, 정수형 매개변수 2개 -->
			<!-- <aop:pointcut id="point1" expression="execution(void kr.co.softcampus.beans.TestBean1.method1(int, int))"/> -->
			
			<!-- 반환타입이 void, kr.co.softcampus.beans.TestBean1클래스, method1 메서드, 정수형 매개변수 1개, String 타입 매개변수 1개 -->
			<!-- <aop:pointcut id="point1" expression="execution(void kr.co.softcampus.beans.TestBean1.method1(int, java.lang.String))"/> -->
			
			<!-- 반환타입이 void, kr.co.softcampus.beans.TestBean1클래스, method1 메서드, 모든 타입의 매개변수 2개 -->
			<!-- <aop:pointcut id="point1" expression="execution(void kr.co.softcampus.beans.TestBean1.method1(*, *))"/> -->
			
			<!-- 반환타입이 void, kr.co.softcampus.beans.TestBean1클래스, method1메서드, 모든 타입의 매개변수 0개이상 -->
			<!-- <aop:pointcut id="point1" expression="execution(void kr.co.softcampus.beans.TestBean1.method1(..))"/> -->
			
			<!-- 반환타입이 void, kr.co.softcampus.beans.TestBean1클래스, 모든 메서드 -->
			<!-- <aop:pointcut id="point1" expression="execution(void kr.co.softcampus.beans.TestBean1.*(..))"/> -->
			
			<!-- 반환타입이 void, kr.co.softcampus.beans 패키지의 모든 클래스, method1 메서드 -->
			<!-- <aop:pointcut id="point1" expression="execution(void kr.co.softcampus.beans.*.method1(..))"/> -->
			
			<!-- 반환타입이 void, kr.co.softcampus.beans 패키지의 모든 클래스, 모든 메서드 -->
			<!-- <aop:pointcut id="point1" expression="execution(void kr.co.softcampus.beans.*.*(..))"/> -->
			
			<!-- 반환타입이 void, kr.co.softcampus.의 모든 패키지의 모든클래스, 모든 메서드 -->
			<!-- <aop:pointcut id="point1" expression="execution(void kr.co.softcampus.*.*.*(..))"/> -->
			
			<!-- 반환타입이 void, 모든 패키지, 모든 클래스, 모든 메서드 -->
			<!-- <aop:pointcut id="point1" expression="execution(void *.*(..))"/> -->
			
			<!-- 반환타입이 int, 모든 패키지, 모든 클래스, 모든 메서드 -->
			<!-- <aop:pointcut id="point1" expression="execution(int *.*(..))"/> -->
			
			<!-- 모든 반환타입, 모든 패키지, 모든 클래스, 모든 메서드 -->
			<!-- <aop:pointcut id="point1" expression="execution(* *.*(..))"/> -->
			
			<aop:pointcut id="point1" expression="execution(* method1(..))"/>
			
			
			
			
			
			
			<aop:before method="beforeMethod" pointcut-ref="point1"/>
		</aop:aspect>
	</aop:config>    
</beans>

 

AdvisorClass.java

package kr.co.softcampus.advisor;

public class AdvisorClass {
	
	public void beforeMethod() {
		System.out.println("beforeMethod 호출");
	}

}

 

TestBean1.java

package kr.co.softcampus.beans;

public class TestBean1 {
	
	public void method1() {
		System.out.println("beans.TestBean1.method1()");
	}
	
	public void method1(int a1) {
		System.out.println("beans.TestBean1.method1(int)");
	}
	
	public void method1(String a2) {
		System.out.println("beans.TestBean1.method1(java.lang.String)");
	}
	
	public void method1(int a1, int a2) {
		System.out.println("beans.TestBean1.method1(int, int)");
	}
	
	public void method1(int a1, String a2) {
		System.out.println("beans.TestBean1.method1(int, String)");
	}
	
	public void method2() {
		System.out.println("beans.TestBean1.method2()");
	}
	
	public int method3() {
		System.out.println("int beans.TestBean1.method3()");
		return 100;
	}
	
}

 

TestBean2.java

package kr.co.softcampus.beans;

public class TestBean2 {
	
	public void method1() {
		System.out.println("beans.TestBean2.method1()");
	}
}

 

TestBean1.java

package kr.co.softcampus.beans2;

public class TestBean1 {
	
	public void method1() {
		System.out.println("beans2.TestBean1.method1()");
	}
}

 

main.java

package kr.co.softcampus.main;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import kr.co.softcampus.beans.TestBean1;
import kr.co.softcampus.beans.TestBean2;

public class MainClass {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("kr/co/softcampus/config/beans.xml");
		
		TestBean1 xml1 = ctx.getBean("xml1", TestBean1.class);
		TestBean2 xml2 = ctx.getBean("xml2", TestBean2.class);
		kr.co.softcampus.beans2.TestBean1 xml3 = ctx.getBean("xml3", kr.co.softcampus.beans2.TestBean1.class);
		
		xml1.method1();
		
		System.out.println("---------------------------------");
		
		xml1.method1(100);
		
		System.out.println("-----------------------------------");
		
		xml1.method1("문자열");
		
		System.out.println("----------------------------------------");
		
		xml1.method1(100, 200);
		
		System.out.println("-----------------------------------------");
		
		xml1.method1(100, "문자열");
		
		System.out.println("----------------------------------------");
		
		xml1.method2();
		
		System.out.println("--------------------------------------------");
		
		xml2.method1();
		
		System.out.println("---------------------------------------------");
		
		xml3.method1();
		
		System.out.println("-------------------------------------------------");
		
		int a1 = xml1.method3();
		System.out.printf("a1 : %d\n", a1);
		
		ctx.close();
	}
}

 

정리

포인트컷을 지정할 때 사용하는 문법에 대해 알아보았습니다. 상황에 따라, 다양한 방식으로 포인트컷 적용 여부를 선택할 수 있는 것을 알 수 있었습니다. 해당 beans.xml 파일을 주석 처리된 코드들을 따라가보면, 어떠한 방식으로 적용할 수 있는지 알 수 있습니다.

특정 메소드에 대해 관점적으로 분리해, 에러가 난 경우, 에러가 나지 않은 경우에 대해 실행될 메소드를 적용할 수 있고, 이러한 기능들을 토대로 웹 개발자들은 로직에 좀 더 집중할 수 있겠구나라는 생각이 들었습니다. 

구체적인 내용과 정보들은 아래 강좌에서 확인하실 수 있습니다. 쉽게 친절히 강의를 진행해주셔서, 개인적으로 강사님의 강좌를 여러가지를 들으면서 공부하고 있습니다.

https://www.udemy.com/course/sooftcampus-sfb/

 

초보 Spring Framework 개발자를 위한 실습을 통한 입문 과정 윤재성

Spring Framework 입문을 위한 주제별 실습 및 상세 설명( beginner step1)

www.udemy.com

반응형